SQL Server根据另一个表中的行透视多个列

时间:2013-10-16 03:22:51

标签: sql sql-server sql-server-2008

我在sql server 2008R2中有两个源表和一个目标表。 如何在TSQL中使用pivot来从源头到达目的地?我迫切需要它。

来源表1:ProdType


key     name
--------------
1       Magazines
2       Journals
3       Books
4       Newspaper

来源表2:订单


seqno   ODate       Key     Qty      UnitPrice
--------------------------------------------------
1   2013-10-12      1    10       5
2   2013-10-12      4    20       3
3   2013-10-13      2    5        3
4   2013-10-14      4    50       5
5   2013-10-15      1    100      2.5

目的地表:订单明细

                         
Odate       Magazine       Journals       Books       Newspaper
-----------------------------------------------------------------   
12/10/2013      10    5    0    0       0      0      20      3
13/10/2013       0    0    5    3       0      0       0      0
14/10/2013       0    0    0    0       0      0      50      5
15/10/2013     100    2.5  0    0       0      0       0      0
-----------------------------------------------------------------
NOTE            *qty    *unit price                 

任何帮助将不胜感激!正如您所知,我对T-SQL(或一般的SQL)和SQL Server都很陌生。提前谢谢!

2 个答案:

答案 0 :(得分:1)

with cte as (
    select
        O.ODate, P.Name,
        sum(O.Qty) as Qty,
        sum(O.UnitPrice * O.Qty) / sum(O.Qty) as UnitPrice
    from Orders as O
        inner join ProdType as P on P.Id = O.Id
    group by O.ODate, P.Name
)
select
    ODate,
    max(case when Name = 'Magazines' then Qty else 0 end) as Magazines_Qty,
    max(case when Name = 'Magazines' then UnitPrice else 0 end) as Magazines_UnitPrice,
    max(case when Name = 'Journals' then Qty else 0 end) as Journals_Qty,
    max(case when Name = 'Journals' then UnitPrice else 0 end) as Journals_UnitPrice,
    max(case when Name = 'Books' then Qty else 0 end) as Books_Qty,
    max(case when Name = 'Books' then UnitPrice else 0 end) as Books_UnitPrice,
    max(case when Name = 'Newspaper' then Qty else 0 end) as Newspaper_Qty,
    max(case when Name = 'Newspaper' then UnitPrice else 0 end) as Newspaper_UnitPrice
from cte
group by ODate

或动态,如果你想:

declare @stmt nvarchar(max)

select @stmt =
      isnull(@stmt + ', ', '') +
      'max(case when Name = ''' + name + ''' then Qty else 0 end) as ' + quotename(name + '_Qty') + ',' +
      'max(case when Name = ''' + name + ''' then UnitPrice else 0 end) as ' + quotename(name + '_UnitPrice')
from ProdType

select @stmt = '
    with cte as (
        select
            O.ODate, P.Name,
            sum(O.Qty) as Qty,
            sum(O.UnitPrice * O.Qty) / sum(O.Qty) as UnitPrice
        from Orders as O
            inner join ProdType as P on P.Id = O.Id
        group by O.ODate, P.Name
    )
    select
        ODate, ' + @stmt + ' from cte group by ODate'

exec dbo.sp_executesql
    @stmt = @stmt

<强> sql fiddle demo

答案 1 :(得分:0)

如果你不介意在不同的表中有数量和单位价格,这里是qty目的地表的示例查询:

;with cte as
(
SELECT ODate, Qty, UnitPrice, name FROM Orders INNER JOIN ProdType ON Orders.[Key] = ProdType.[Key]
)
SELECT ODate, [Magazines], [Journals], [Books], [Newspaper]  
FROM cte
PIVOT
(
SUM(Qty)
FOR name IN ([Magazines], [Journals], [Books], [Newspaper])
) AS QTYPivot