【问题标题】:PIvot with multiple result values具有多个结果值的 Pivot
【发布时间】:2017-02-21 20:08:04
【问题描述】:

我试图在这个数据透视表中输入多个总和,但我没有成功,

这是原始数据 来自

select 
    billname, 
    orderperiodyear,
    Sum_buyprice,
    Sum_Sellprice,
    Tonnage 
From Sum_Orders

这是我的支点如何在支点结果中包含购买价格和吨位

SELECT billname,SUM([2017])AS '2017', SUM([2016]) AS '2016'
FROM   Sum_Orders
PIVOT
    (
       SUM(Sum_SellPrice)
            FOR OrderperiodYear IN ([2017],[2016])
     )AS pvt
WHERE  OrderStatus IN ('Complete', 'Invoiced') 
  AND ( (MONTH(OrderDate) = MONTH(GETDATE()) AND day(OrderDate) <= DAY(GETDATE()))
   OR MONTH(OrderDate) < MONTH(GETDATE()))

Group by BILLNAME
HAVING COALESCE(SUM([2017]), SUM([2016])) IS NOT NULL
ORDER BY BILLNAME ASC

这是我从我的支点得到的

我正在寻找这样的东西

【问题讨论】:

标签: sql-server sql-server-2008 pivot pivot-table


【解决方案1】:

您首先必须先进行反透视DEMO

SELECT billname, 
       CAST([OrderperiodYear] as varchar(500)) + '_' + CAST([attribute] as varchar(500)) as attribute,
       [data]
FROM (SELECT billname, 
             [OrderperiodYear],
             [Sum_Buyprice] as Buy,
             [Sum_Sellprice] as Sell,
             [Tonnage] as Ton
      FROM records) p
UNPIVOT 
    ([data] FOR [attribute] IN 
                (Buy, Sell, Ton)
     ) as unpvt

输出

然后你可以创建一个Dynamic Pivot

【讨论】:

  • 当值为空时,此示例存在问题。您可以通过使用合并来解决并将它们转换为负数,例如 -1。 rextester.com/ZOO68838 或检查任何version
【解决方案2】:

一种选择是跳过pivot() 并使用旧式交叉表。

select 
    billname
  , [2016_buyprice]  = sum(case when OrderPeriodYear = 2016 then sum_buyprice else null end)
  , [2017_buyprice]  = sum(case when OrderPeriodYear = 2017 then sum_buyprice else null end)
  , [2016_sellprice] = sum(case when OrderPeriodYear = 2016 then sum_sellprice else null end)
  , [2017_sellprice] = sum(case when OrderPeriodYear = 2017 then sum_sellprice else null end)
  , [2016_tonnage]   = sum(case when OrderPeriodYear = 2016 then tonnage else null end)
  , [2017_tonnage]   = sum(case when OrderPeriodYear = 2017 then tonnage else null end)
from sum_orders 
where OrderStatus in ('Complete', 'Invoiced') 
  and ((month(OrderDate) = month(getdate()) 
    and day(OrderDate) <= day(getdate()))
    or month(OrderDate) < month(getdate()))
group by billname
order by billname asc

【讨论】:

  • 这也将让您了解如何使用 pivot 解决它。而不是尝试像{2017, {buy,sell,tonnage}} 这样的多级列,而是创建列{2017_buy, 2017_sell, 2017_tonnage}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多