我有一个这样的表:
Column = NAME
Column = DATE
NAME | DATE | Y/N
John | 01/01/2012 | bit
Mary | 01/01/2012 | bit
James | 01/01/2012 | bit
John | 01/02/2012 | bit
Mary | 01/02/2012 | bit
James | 01/02/2012 | bit
John | 01/03/2012 | bit
Mary | 01/03/2012 | bit
James | 01/03/2012 | bit
我想创建某种形式的矩阵或枢轴,所以我最终得到了这个:
NAME | 01/01/2012 | 01/02/2012 | 01/03/2012
John | bit | bit | bit
Mary | bit | bit | bit
James | bit | bit | bit
我见过一些具有少量列项(如 Banana、Apple、Orange)的数据透视示例,我需要有不确定数量的名称和不确定数量的日期(因此,没有硬编码的列名称) .我正在考虑拆分成多个表,但我总是需要动态创建日期列或名称列。
有人能帮忙吗?
最佳答案
也许是这样的:
测试数据
CREATE TABLE Table1
(
NAME VARCHAR(100),
[DATE] DATE,
[Y/N] BIT
)
INSERT INTO Table1
VALUES
('John','01/01/2012',1),
('Mary','01/01/2012',0),
('James','01/01/2012',1),
('John','01/02/2012',0),
('Mary','01/02/2012',1),
('James','01/02/2012',1),
('John','01/03/2012',1),
('Mary','01/03/2012',0),
('James','01/03/2012',0)
查找唯一列
DECLARE @cols VARCHAR(MAX)
;WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY [DATE] ORDER BY [DATE]) AS RowNbr,
convert(varchar, [DATE], 103) AS [Date]
FROM
Table1
)
SELECT @cols=STUFF
(
(
SELECT
',' +QUOTENAME([Date])
FROM
CTE
WHERE
CTE.RowNbr=1
FOR XML PATH('')
)
,1,1,'')
声明并执行动态sql
DECLARE @query NVARCHAR(4000)=
N'SELECT
*
FROM
(
SELECT
Table1.NAME,
CAST(Table1.[Y/N] AS INT) AS [Y/N],
convert(varchar, Table1.[DATE], 103) AS [Date]
FROM
Table1
) AS p
PIVOT
(
MAX([Y/N])
FOR [Date] IN ('+@cols+')
) AS pvt'
EXECUTE(@query)
清理自己
DROP TABLE Table1
结果
Name 01/01/2012 02/01/2012 03/01/2012
James 1 1 0
John 1 0 1
Mary 0 1 0
关于SQL Server 2008 - 从另一个表动态创建一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10001166/