我从未使用过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,所以我不想手动指定它们,但如果有必要,我可以。
感谢您的帮助!
答案 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
的容器,然后填写空白。