Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server基于另一个表中的行透视多个列_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL Server基于另一个表中的行透视多个列

SQL Server基于另一个表中的行透视多个列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,在SQLServer2008R2中有以下两个源表和一个目标表。 如何在TSQL中使用pivot从源代码到达目标?我急需它 来源表1:ProdType key name -------------- 1 Magazines 2 Journals 3 Books 4 Newspaper 来源表2:订单 seqno ODate Key Qty UnitPrice ----------------------

在SQLServer2008R2中有以下两个源表和一个目标表。 如何在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非常陌生。提前谢谢

如果您不介意将数量和单价放在不同的表中,下面是一个查询数量目标表的示例:

;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

如果您不介意将数量和单价放在不同的表中,下面是一个查询数量目标表的示例:

;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
或动态,如果您想:

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

或动态,如果您想:

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

各位专家您好……有人能帮忙吗?我问了一个非常类似的问题-各位专家您好……有人能帮忙吗?我问了一个非常类似的问题-嗨,罗曼,谢谢您的帮助。但产品类型可能有所不同(可能较少/可能较多)。所以,我无法解决这个问题。有什么建议可以让它充满活力吗?@Amy实际上,关于它的问题已经很多了:)非常感谢,Roman。它工作得很好。你节省了我的时间,帮助我摆脱紧张的生活。真的很感激!:)是的……事实上,我也看了其他问题……但还是找不到我真正需要的。也许我对SQL太陌生了。嗨,罗曼,谢谢你的帮助。但产品类型可能有所不同(可能较少/可能较多)。所以,我无法解决这个问题。有什么建议可以让它充满活力吗?@Amy实际上,关于它的问题已经很多了:)非常感谢,Roman。它工作得很好。你节省了我的时间,帮助我摆脱紧张的生活。真的很感激!:)是的……事实上,我也看了其他问题……但还是找不到我真正需要的。也许我对SQL太陌生了…谢谢,Panayotis。根据我的项目要求,他们需要在同一个表中,也需要顺序。谢谢,Panayotis。根据我的项目要求,它们需要在同一个表中,也需要顺序。