1

这是我的 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 中的值是什么,它们将是动态的。

4

2 回答 2

3

如果您使用的是 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
于 2012-05-10T03:07:24.747 回答
0

数据库不是很擅长做你所要求的。虽然我确信这是可能的并且有人会在此处发布解决方案,但也许您可以使用一点 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
于 2012-05-10T02:54:13.233 回答