SQL - максимальный суммарный доход по месяцам по странам - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь найти рекордные месяцы дохода для каждой страны. Ниже запрос предоставляет мне доход по месяцам для каждой страны.

select d.calendar_year_month as 'Record_month',
c.country_name as 'country'
,sum(Net_qty*(unit_charge+unit_shipping_charge)) as 'Revenue'

from sensu_reporting.commercial_analysts.customer_science_transactions CST (nolock)
join Sensu.dbo.Country_D C (nolock) on cst.country_code = c.Country_Code
join sensu.dbo.Date_D d (nolock) on cst.Order_Date_Key = d.Date_Key


where cst.site_key in ('95')
and cst.order_date_key >= 20180101

group by d.calendar_year_month, c.country_name

Я пытался использовать:

select a.country,
a.record_month,
max(a.revenue) as 'Record_Revenue'

from(
select d.calendar_year_month as 'Record_month',
c.country_name as 'country'
,sum(Net_qty*(unit_charge+unit_shipping_charge)) as 'Revenue'

from sensu_reporting.commercial_analysts.customer_science_transactions CST (nolock)
join Sensu.dbo.Country_D C (nolock) on cst.country_code = c.Country_Code
join sensu.dbo.Date_D d (nolock) on cst.Order_Date_Key = d.Date_Key


where cst.site_key in ('95')
and cst.order_date_key >= 20180101

group by d.calendar_year_month, c.country_name)
a 
group by country, record_month

Однако это дает мне те же данные, что и первоначальный запрос. Что я делаю неправильно, и как мне изменить свой запрос таким образом, чтобы он давал мне только месяц с самым высоким доходом на страну?

Ответы [ 2 ]

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

Это то, что вы хотите?

with r as (
      select d.calendar_year_month as Record_month,
             c.country_name as country,
             sum(Net_qty*(unit_charge+unit_shipping_charge)) as Revenue
      from sensu_reporting.commercial_analysts.customer_science_transactions CST join
           Sensu.dbo.Country_D C
           on cst.country_code = c.Country_Code join
           sensu.dbo.Date_D d
           on cst.Order_Date_Key = d.Date_Key
       where cst.site_key in ('95') and cst.order_date_key >= 20180101
       group by d.calendar_year_month, c.country_name
      )
select r.*
from (select r.*,
             row_number() over (partition by record_month order by revenue desc) as seqnum
      from r
     ) r
where seqnum = 1;
0 голосов
/ 05 мая 2018

Так как я не знал структуру вашей таблицы, это упрощенный пример только с одной таблицей (id, calendar_year_month, код страны, доход). Я использовал подзапрос, чтобы определить максимальный доход.

select calendar_year_month, country, revenue
from reporting r
where revenue = (select max(revenue) from reporting r2 where r.country = r2.country )
group by calendar_year_month, country

И результат, который я получил, был таким

201802 NO 1500
201802 SE 3000
201803 DE 7000
201803 NO 1500

Обратите внимание, есть две строки для NO. Я надеюсь, что это переносится на структуру вашего стола.

...