2014-09-19 2 views
0

Все,Создать сводную таблицу в SQL без функции поворота

У меня есть следующая таблица.

SalesDate SubChannel  Country NetQuantity 
20140826 TV Attributable  CA   194 
20140826 Unknown    CA   60 
20140826 Web Property   CA   64 
20140826 Overall    CA   264 
20140826 Search    CA   70 

Я хочу отобразить эту информацию как сводную таблицу.

Прежде чем я использовал следующий фрагмент кода, чтобы это произошло, но для текущей системы, к которой я должен перейти, не поддерживает функции поворота.

Select  SalesDate, 
    Country, 
    [Search], 
    [Unknown], 
    [Web Property], 
    [TV Attributable], 
    [Overall] 
From temp 
PIVOT 
(
Sum([NetQuantity]) 
FOR [SubChannel] IN ([Search],[Unknown],[Web Property],[TV Attributable],[Overall]) 
) as p 

Может кто-нибудь помочь мне выполнить следующий вывод:

SalesDate Country Search Unknown WebProperty  TVAttributable  Overall 
20140826   CA  70  60   64     194   264 
+0

Какую систему вы используете? Может быть какая-то силимарная функция, если опорная точка не поддерживается. – jpw

+0

Я просматриваю всю документацию, и даже когда система использует psql, она не поддерживает опорные функции. Поэтому я просто пытаюсь найти работу. Но до сих пор мне не удалось найти запрос, который мог бы сделать трюк. – Pierre

+0

Вы отметили сообщение psql, это Postgresql, который вы используете? – jpw

ответ

0

Вы можете использовать CASE заявления с GROUP BY сделать стержень «вручную»;

SELECT "SalesDate", MAX("Country") "Country", 
    MAX(CASE WHEN "SubChannel"='Search' 
      THEN "NetQuantity" END) "Search", 
    MAX(CASE WHEN "SubChannel"='Unknown' 
      THEN "NetQuantity" END) "Unknown", 
    MAX(CASE WHEN "SubChannel"='Web Property' 
      THEN "NetQuantity" END) "WebProperty", 
    MAX(CASE WHEN "SubChannel"='TV Attributable' 
      THEN "NetQuantity" END) "TVAttributable", 
    MAX(CASE WHEN "SubChannel"='Overall' 
      THEN "NetQuantity" END) "Overall" 
FROM temp 
GROUP BY "SalesDate"; 

An SQLfiddle to test with.

В основном, операторы CASE выбирают значение, если подканал соответствует или null, если нет совпадения. Затем MAX используется для выбора наибольшего (не нулевого) соответствия для каждого подканала.

Если даты продаж необходимо разделить по странам, вы можете просто заменить выражение MAX("Country") только «Страна» и добавить страну в GROUP BY.

+1

Большое вам спасибо! Это прекрасно работает. – Pierre

0

Вы можете использовать CASE, чтобы определить, что подводить итоги для каждой категории. Как вы используете SUM в примере поворота, я думаю, вы могли бы это и не MAX:

Select 
    "SalesDate", 
    "Country", 
    sum(case when "SubChannel" = 'Search' then "NetQuantity" else 0 end) "Search", 
    sum(case when "SubChannel" = 'Unknown' then "NetQuantity" else 0 end) "Unknown", 
    sum(case when "SubChannel" = 'Web Property' then "NetQuantity" else 0 end) "Web Property", 
    sum(case when "SubChannel" = 'TV Attributable' then "NetQuantity" else 0 end) "TV Attributable", 
    sum(case when "SubChannel" = 'Overall' then "NetQuantity" else 0 end) "Overall" 
from temp 
group by "SalesDate", "Country" 

Sample SQL Fiddle

+0

JPW, вы правы, мне нужно было сделать сумму. – Pierre

+0

@Pierre Я так и думал. – jpw

Смежные вопросы