SQL Server透视许多列

时间:2012-03-07 04:20:40

标签: sql-server tsql pivot

我从未使用过SQL Pivot,但我认为现在是我的机会。问题是,我真的不知道如何。我一直在阅读文档,但似乎我想要的结果可能稍微复杂一些,而我现在几乎无法处理简单的枢轴。

我有这张桌子

Create table dataTable (dataID int, containerID int)

我想查询它,以便我的结果集格式为:

Create table pivotTable (DataID int, Container1 bit, Container2 bit, ...ContainerN bit)

其中dataTable中的每个DataID都变成一行,如果dataTable中存在元组{DataID,ContainerN},则ConatinerN的位值为1,如果不存在,则为0。有480个ContainerID,所以我不想手动指定它们,但如果有必要,我可以。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

也许是这样的:

测试数据

Create table dataTable (dataID int, containerID int)

INSERT INTO dataTable
VALUES
    (1,1),
    (2,1),
    (3,3),
    (4,2)

唯一列

DECLARE @cols VARCHAR(MAX)
DECLARE @colsWithIsNull VARCHAR(MAX)
;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY containerID ORDER BY containerID) AS RowNbr,
        CAST(containerID AS VARCHAR(100)) AS containerID
    FROM 
        dataTable
)
SELECT  @cols = COALESCE(@cols + ','+QUOTENAME('Container'+containerID),
                    QUOTENAME('Container'+containerID)),
        @colsWithIsNull= COALESCE(@colsWithIsNull + ',CAST(ISNULL('+QUOTENAME('Container'+containerID)+',0) AS BIT) AS '+QUOTENAME('Container'+containerID),
                    'CAST(ISNULL('+QUOTENAME('Container'+containerID)+',0) AS BIT) AS '+QUOTENAME('Container'+containerID))
FROM
    CTE
WHERE
    CTE.RowNbr=1

动态支点

DECLARE @query NVARCHAR(4000)=
N'SELECT
    dataID,
    '+@colsWithIsNull+'
FROM
(
    SELECT
        ''Container''+CAST(dataTable.containerID AS VARCHAR(100)) AS ContainerText,
        1 AS isContainer,
        dataTable.dataID
    FROM
        dataTable
) AS p
PIVOT
(
    MAX(isContainer)
    FOR ContainerText IN ('+@cols+')
) AS pvt'

EXECUTE(@query)

在我的情况下,我将删除测试表:

DROP TABLE dataTable

答案 1 :(得分:1)

像这样透视数据并没有多大意义。这是在应用程序的数据访问层中完成的更好的工作。正如你所说,你应该像这样返回数据集......

{ DataID INT, ContainerNumber INT }

为了让您的生活更轻松,只需返回列中1的容器,然后填写空白。