【问题标题】:SQL Server 2005 - Pivoting Data without a sum / count and dynamic list of valuesSQL Server 2005 - 在没有总和/计数和动态值列表的情况下透视数据
【发布时间】:2009-10-08 00:18:05
【问题描述】:

很抱歉,如果另一个问题的其他地方对此进行了介绍,但我找不到任何与我需要的完全匹配的示例,我感到很困惑。

我在表格中有这样的数据:-

Name   |   Value
---------------
John   |   Dog
John   |   Cat
John   |   Fish
Bob    |   Python
Bob    |   Camel

我想要这样的数据....

Name   |  Value_1 | Value_2 | Value_3
-------------------------------------
John   |  Dog     |  Cat    | Fish
Bob    |  Python  |  Camel  | NULL

我不想使用 case 语句,因为狗、猫、鱼等有 20 多个可能的值,而且它们可能会随着时间而改变。

有人指点吗?

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql pivot


    【解决方案1】:

    这接近于您所追求的。我还包括一个表格创建脚本和示例数据供其他人使用。这个解决方案的灵感来自here

    -- Dynamic PIVOT
    DECLARE @T AS TABLE(y INT NOT NULL PRIMARY KEY);
    
    DECLARE
    @cols AS NVARCHAR(MAX),
    @y    AS INT,
    @sql  AS NVARCHAR(MAX);
    
    -- Construct the column list for the IN clause
    -- e.g., [Dog],[Python]
    SET @cols = STUFF(
    (SELECT N',' + QUOTENAME(y) AS [text()]
    FROM (SELECT DISTINCT [Value] AS y FROM dbo.table_1) AS Y
    ORDER BY y
    FOR XML PATH('')),
    1, 1, N'');
    
    -- Construct the full T-SQL statement
    -- and execute dynamically
    SET @sql = N'SELECT *
    FROM (SELECT *
    FROM dbo.table_1) AS D
    PIVOT(MIN(value) FOR value IN(' + @cols + N')) AS P;';
    
    PRINT @sql
    EXEC sp_executesql @sql;
    GO
    

    表创建:

    CREATE TABLE [dbo].[Table_1](
        [Name] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
        [Value] [varchar](50) COLLATE Latin1_General_CI_AS NULL
    ) ON [PRIMARY]
    
    GO
    

    样本数据:

    insert into dbo.table_1 values ('John','Dog')
    insert into dbo.table_1 values ('John','Cat')
    insert into dbo.table_1 values ('John','Fish')
    insert into dbo.table_1 values ('Bob ','Python')
    insert into dbo.table_1 values ('Bob ','Camel')
    

    【讨论】:

    • 谢谢,我想这可能暂时可以完成这项工作:)
    【解决方案2】:
    【解决方案3】:
    猜你喜欢
    • 2012-11-05
    • 2018-12-31
    • 1970-01-01
    • 2017-05-27
    • 2012-02-22
    • 2012-03-24
    • 1970-01-01
    • 2019-03-31
    • 2013-06-12
    相关资源
    最近更新 更多