SQL я хочу получить следующий вывод

У меня есть таблица продаж

Date_s sales_man product qty
1-Jan-18   xx    01       30
1-Jan-18   xx    01       20
1-Jan-18   xy    01       20 
1-Feb-18   xz    02       10
5-Feb-18   xz    02       30
1-Feb-18   xx    01       10
1-Feb-18   xx    01       40
1-Mar-18   xy    03       20

Я хочу получить следующий формат выходных данных как

Product  sales_man  Jan  Feb   Mar
01       xx         50    10    0 
01       xy         20    0     0 
02       xx         0     0     0
02       xy         0     0     0
02       xz         0     0     0
03       xy         0     0     20

3 ответа

Решение

Если я правильно понял Вашу проблему, вы можете попробовать:

SELECT * into #TempTable FROM 
(select product, salesman, qty, FORMAT(Dates, 'MMM') as Months from sales
) AS s 
PIVOT 
(
   SUM(qty)
   FOR Months in (Jan, Feb)
) AS Pvt



select product, salesman, isnull(Jan, 0) as Jan, isnull(Feb, 0) as Feb from 
#TempTable order by product

drop table #TempTable

Вы можете использовать агрегацию. Что-то вроде этого:

select product, salesperson,
       sum(case when extract(month from dates) = 1 then qty else 0 end) as jan,
       sum(case when extract(month from dates) = 2 then qty else 0 end) as feb
from t
group by product, salesperson;

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

Кроме того, при просмотре данных по месяцам, как правило, также необходимо учитывать год (путем фильтрации или агрегирования по году).

Если вы можете изменить формат даты с "1-Jan-18" на "1-01-18", то вы можете сделать это ниже

проверить скрипку sql

http://sqlfiddle.com/

Если вы считаете ниже формат даты "1-01-18", "1-01-18", "1-02-18";

тогда вы можете сделать этот запрос

select product, salesman,
       sum(case when extract(month from dates) = 1 then qty else 0 end) as jan,
       sum(case when extract(month from dates) = 2 then qty else 0 end) as feb
from sales
group by product, salesman;

Результат

product salesman    jan feb
1       xx          30  0
1       xz          0   20
2       xy          10  0

За весь месяц

http://sqlfiddle.com/

для всех сделай запрос вот так,

select product, salesman,
       sum(case when extract(month from dates) = 1 then qty else 0 end) as jan,
       sum(case when extract(month from dates) = 2 then qty else 0 end) as feb,
       sum(case when extract(month from dates) = 3 then qty else 0 end) as mar,
       sum(case when extract(month from dates) = 4 then qty else 0 end) as apr,
       sum(case when extract(month from dates) = 5 then qty else 0 end) as may,
       sum(case when extract(month from dates) = 6 then qty else 0 end) as jun,
       sum(case when extract(month from dates) = 7 then qty else 0 end) as jul,
       sum(case when extract(month from dates) = 8 then qty else 0 end) as aug,
       sum(case when extract(month from dates) = 9 then qty else 0 end) as sep,
       sum(case when extract(month from dates) = 10 then qty else 0 end) as oct,
       sum(case when extract(month from dates) = 11 then qty else 0 end) as nov,
       sum(case when extract(month from dates) = 12 then qty else 0 end) as dece
from sales
group by product, salesman;

Результат будет

product salesman    jan feb mar apr may jun jul aug sep oct nov dece
1       xx          30  0   0   0   0   0   0   0   0   0   0   0
1       xz          0   20  0   0   0   0   0   0   0   0   0   0
2       xy          10  0   0   0   0   0   0   0   0   0   0   0
Другие вопросы по тегам