SQL Server 2008 - 从另一个表动态创建一个表

标签 sql pivot

我有一个这样的表:

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/

相关文章:

excel - Microsoft Excel Pivot 对正数和负数的 Sum 计算错误

具有 ENUM 的 MAX() 值的 MYSQL JOIN

sql - 按最新 LastModifiedDatetime 排序的前 30 条不同记录

mysql - 通过将行旋转为动态列数在 MySQL 中创建摘要 View

php - 从查询中检索特定键值并在查询中获取它们对的计数

python - pandas:如何使用多索引运行数据透视?

python - 如何在不丢失列的情况下将列(类别类型)转换为列?

windows-phone-7 - 防止 Windows Phone 中的枢轴导航

sql - 从表中删除孤儿

mysql - 获取特定字段数据备份以及mysql中的更新查询