我想知道你是否可以使用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中执行此操作。
谢谢!
答案 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)