这是我的 SQL 表:
Table1
Col1 Col2
a 1
a 2
a 3
b 1
c 1
c 2
如何查询此表以显示为这样?
col1,value1,value2,value3
a,1,2,3
b,1,null,null
c,1,2,null
col1 中的每个值永远不会超过 5 条记录。我不知道 col2 中的值是什么,它们将是动态的。
这是我的 SQL 表:
Table1
Col1 Col2
a 1
a 2
a 3
b 1
c 1
c 2
如何查询此表以显示为这样?
col1,value1,value2,value3
a,1,2,3
b,1,null,null
c,1,2,null
col1 中的每个值永远不会超过 5 条记录。我不知道 col2 中的值是什么,它们将是动态的。
如果您使用的是 SQL 2005 或更高版本,PIVOT 是一个不错的选择。对于静态查询,您可以假设值的最大数量为 1、2、3...,并像这样使用 PIVOT:
SELECT Col1 AS 'Col1',
[1], [2], [3], [4], [5]
FROM
(SELECT Col1, Col2
FROM dbo.Table1) AS SourceTable
PIVOT
(
MAX(Col2)
FOR Col2 IN ([1], [2], [3], [4], [5])
) AS PivotTable;
如果您接受动态 SQL,则可以构建 SQL 语句并使用以下命令执行它sp_executesql
:
DECLARE @Values VARCHAR(1000)
DECLARE @SQL NVARCHAR(MAX)
SET @Values = NULL
SELECT
@Values = COALESCE(@Values + ', ', '') + + '[' + CAST(Col2 AS VARCHAR) + ']'
FROM (SELECT DISTINCT TOP 100 PERCENT Col2 FROM dbo.Table1 ORDER BY 1) T
SET @SQL = '
SELECT Col1 AS ''Col1'',
' + @Values + '
FROM
(SELECT Col1, Col2
FROM dbo.Table1) AS SourceTable
PIVOT
(
MAX(Col2)
FOR Col2 IN (' + @Values + ')
) AS PivotTable;
'
EXECUTE sp_executesql @SQL
数据库不是很擅长做你所要求的。虽然我确信这是可能的并且有人会在此处发布解决方案,但也许您可以使用一点 bash 脚本让您的生活更轻松。
此代码获取第 1 列中所有唯一值的列表。然后它在表中查询第 2 列中的所有值以获得第 1 列中的给定值。“tr”命令将换行符替换为逗号和 sed 命令将最后一个逗号切换回换行符。
我的感觉是,如果您发布更多关于您的特定问题的信息,那么您的问题可能会有更好的解决方案。任何纯查询的解决方案都将涉及将表链接到自身 5 次,这可能需要大量处理,具体取决于表的大小。
注意:由于问题没有详细信息,我做了几个假设。我假设我们正在使用 postgresql,并且该数据库称为 test。
#!/bin/bash
echo "select distinct col1 from table1 order by col1" | psql -At test | while read col1;do
echo -n "$col1,"
echo "select col2 from table1 where col1='$col1' order by col2" | psql -At test | tr '\n' ',' | sed s/,$/\n/'
done
那么输出是:
a,1,2,3
b,1
c,1,2