T-SQL.GroupBy Усеченный DATETIME и упорядочить по - PullRequest
0 голосов
/ 23 марта 2019

У меня есть простая таблица заказов, как:

Order
=========
Date (DATETIME)
Price (INT) 

И я хотел бы знать, сколько денег мы зарабатывали за каждый месяц, и результат должен выглядеть следующим образом:

January-2018 : 100 
February-2018: 200
...
January-2019: 300
...

У меня есть следующий SQL:

SELECT 
    DATENAME(MONTH , DATEADD(M, t.MDate , -1 ) ) + '-' + CAST(t.YDate as NVARCHAR(20)),
    SUM(Price)
FROM 
(
SELECT 
    DATEPART(YYYY, o.Date) as YDate,
    DATEPART(MM, o.Date) as MDate,  
    Price
FROM [Order] o
) t
GROUP BY t.YDate, t.MDate
ORDER BY t.YDate, t.MDate

Это нормально или, может быть, есть лучший подход?

Ответы [ 3 ]

0 голосов
/ 23 марта 2019

Если вы используете Sql server 2012 или +, вы также можете использовать функцию форматирования.

select cast('2018-02-23 15:34:09.390' as datetime)  as datenew, 100 as price  into #temp union all 
select cast('2018-02-24 15:34:09.390' as datetime)  as datenew, 300 as price   union all 
select cast('2018-03-10 15:34:09.390' as datetime)  as datenew, 500 as price   union all 
select cast('2018-03-11 15:34:09.390' as datetime)  as datenew, 700 as price   union all 
select cast('2019-02-23 15:34:09.390' as datetime)  as datenew, 900 as price   union all 
select cast('2019-02-23 15:34:09.390' as datetime)  as datenew,  1500 as price    

select Monthyear,  total  from  ( 
select format(datenew, 'MMMM-yyyy') Monthyear, format(datenew, 'yyyyMM')  NumMMYY ,sum(price) total from #temp 
group by format(datenew, 'MMMM-yyyy') , format(datenew, 'yyyyMM') ) test 
order by NumMMYY

Поскольку формат преобразует его в nvarchar, мне пришлось создать еще один столбец в подзапросе, чтобы упорядочить его. Если вы не возражаете против еще одного столбца, вам не нужно использовать подзапрос, и вы можете заказать его с другим столбцом. Я не мог найти какой-либо другой способ (кроме оператора case, который не очень хорошая идея), чтобы сделать это в том же select

Output: 
 Monthyear      Total
 February-2018  400
 March-2018     1200
 February-2019  2400
0 голосов
/ 24 марта 2019

format() это путь. Я бы порекомендовал:

select format(o.date, 'MMMM-yyyy') as Monthyear,    
       sum(o.price) as total 
from orders o
group by format(datenew, 'MMMM-yyyy')
order by min(o.date)
0 голосов
/ 23 марта 2019

Может быть только с этим?

with Orders as (
  select convert(date,'2018-01-15') as [date], 10 as Price union all
  select convert(date,'2018-01-20'), 20 union all
  select convert(date,'2018-01-30'), 30 union all
  select convert(date,'2018-02-15'), 20 union all
  select convert(date,'2018-03-15'), 40 union all
  select convert(date,'2018-03-20'), 50

)
select 
  datename(month,o.Date) + '-' + datename(year,o.Date) + ': ' + 
  convert(varchar(max),SUM(Price))
FROM [Orders] o
group by datename(month,o.Date) + '-' + datename(year,o.Date)
order by 1 desc

Я не поправляюсь, почему вы удаляете один месяц в своем запросе, я не делаю этого. Вы можете проверить это здесь: https://rextester.com/GRKK80105

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...