2017-02-21 19 views
1

им пытаются поставить несколько сумм в этой сводной таблице, но я гавань была succeful,Pivot с многократным результате значения

Это данные Сырые из

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

enter image description here

Это мой pivot Как я могу включить цену покупки и тоннаж в результаты стержня

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 

Это то, что я получаю от моего поворота

enter image description here

Im ищет что-то вроде этого

enter image description here

+1

[why-may-i-not-upload-images-of-code] (http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code -on-so-when-ask-a-question/285557 # 285557) –

+0

Сначала вы должны сделать univot, а вместо 'year' вы создаете такие значения, как' year_sell', проверяете этот [** пример **] (http: //stackoverflow.com/a/42354610/3470178), чтобы получить базовый запрос. –

ответ

1

Один из вариантов, чтобы пропустить 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 
+1

Это также даст вам представление о том, как решить проблему с помощью поворота. вместо того, чтобы пытаться использовать многоуровневые столбцы, такие как '{2017, {buy, sell, tonnage}}' вы создаете столбцы '{2017_buy, 2017_sell, 2017_tonnage}' –

2

Вы должны сначала сделать UNPIVOT первый 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 

ВЫХОДА

enter image description here

Тогда вы можете создать Dynamic Pivot.

+0

Существует проблема с этим образцом, когда значение равно null. Вы можете решить, используя coalesce и преобразовать их в отрицательное число, например -1. http://rextester.com/ZOO68838 или проверить все это [** version **] (http://stackoverflow.com/questions/1002989/sql-server-include-null-using-unpivot). –