使用SQL生成包含稀疏数据的列?

时间:2015-03-13 06:55:47

标签: sql sql-server

我想知道你是否可以使用SQL执行以下操作。假设你有一个这样的表:

r| Company | SoldToCustomer | Amount  |  Date
1|    A    |       A1       |  100    | 27-12-1989
2|    A    |       A2       |  200    | 20-02-1990
3|    A    |       A1       |  500    | 20-03-1991
4|    A    |       A2       |  800    | 30-01-1992
5|    B    |       A1       |  900    | 31-01-1992
6|    B    |       A2       |  1000   | 01-02-1993
...

注意:r只是一个指标而不是表格的一部分。它表示行号。我想把它转换成如下表:

r| Company | AmountToCompanyA1  | AmountToCompanyA2 |  Date
1|   A     |      100           |         .         | 27-12-1989
2|   A     |       .            |        200        | 20-02-1990
3|   A     |      500           |         .         | 20-03-1991
4|   A     |       .            |        800        | 30-01-1992
5|   B     |      900           |         .         | 31-01-1992
...

哪里。表示缺少值。我很清楚这种存储是多余的,它给了我一个非常大的表,但我想知道在SQL中是否可以进行这种转换。

请注意,尽管我只使用了两个A1和A2,但大约有9000个A,所以这是不可能手工完成的。

我实际上只想创建一个SQL视图。

PS:我正在尝试在Microsoft SQL Server Management Studio中执行此操作。

谢谢!

1 个答案:

答案 0 :(得分:1)

您需要使用动态PIVOT,如下所示

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.SoldToCustomer) 
            FROM table1 c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT company, ' + @cols + ',date from 
            (
                select company, date
                    , amount
                    , SoldToCustomer
                from table1
           ) x
            pivot 
            (
                 max(amount)
                for SoldToCustomer in (' + @cols + ')
            ) p '


execute(@query)