SQL я хочу получить следующий вывод - PullRequest
0 голосов
/ 02 мая 2018

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

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 ]

0 голосов
/ 02 мая 2018

Если вы можете изменить формат даты с «1 января-18» на «1-01-18», то вы можете сделать это следующим образом:

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

http://sqlfiddle.com/#!9/6d3824/2

Если вы считаете ниже формат даты '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/#!9/6d3824/9

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

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
0 голосов
/ 02 мая 2018

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

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
0 голосов
/ 02 мая 2018

Вы можете использовать агрегацию. Примерно так:

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, поскольку тег вашей базы данных неясен. Дата операции могут отличаться в зависимости от базы данных.

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

...