2015-03-13 52 views
2

我想知道你是否可以用SQL来做以下事情。假设你有这样的表格:使用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

您可以使用动态透视:http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query – 2015-03-13 07:01:30

+2

如果我没有理解好,你会有一个9000列的表格(所有的A)?你可以做一些事情来自动填充这些列,这使得2或50列相同(不需要手动填充),但9000是疯了。对于SQL Server限制,请参阅https://msdn.microsoft.com/en-us/library/ms143432.aspx#Engine。而不是使用普通桌子甚至视图,也尝试PIVOT。这个操作符是用于这种形式的数据(但数量可能仍然是一个问题)。 – AFract 2015-03-13 07:07:11

+0

为什么不使用Case?选择(案例SoldToCustomer当'A1'然后金额其他空结束)AmountToCompanyA1,(案例SoldToCustomer当'A2'然后金额其他空结束)AmountToCompanyA2从....... – 2015-03-13 07:08:05

回答

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)