2013-06-28 3 views
3

года Это мой стол заказовSql Группировка по в диапазоне

enter image description here

Если я хочу, чтобы иметь количество заказов в каждом точном году, я просто могу написать этот запрос

Select COUNT(*) CountOfOrders, Year(OrderDate) Year 
From Orders 
Group by YEAR(OrderDate) 

так что наличие этого ResultSet

enter image description here

Но что должен делать Id, если мне нужен этот набор результатов?

CoundOfOrder  FromYear_toYear 
    5   2005-2010 
    4   2010-2015 
+0

Как вы обрезаете периоды? Не должно ли '2010-2015' иметь 5 или 6 (в зависимости от того, считаете ли вы 2010 год в обоих периодах на нет)? – jpw

+0

На основании данных вашего примера и результатов невозможно определить, в каком диапазоне 2010 учитывается. –

+0

@jpw: Это может быть необязательно. на 2, 3 или 5 лет. Это зависит от данных. Как вы видите выше, на 2011 год заказа нет. –

ответ

6

Вы можете попробовать этот запрос. Это поможет вам самым простым способом.

SELECT COUNT(*),(CONVERT(VARCHAR,MIN(year(orderdate)))+'-' + CONVERT(VARCHAR,MAX(year(orderdate)))) AS yearRange 
FROM orders 
GROUP BY FLOOR(Year(OrderDate) /5) 

вы можете передать ссылку SQL_Fiddle_Link, который использует ваш пример, чтобы сформировать этот запрос.

3
Select COUNT(*) CountOfOrders, 
CASE WHEN Year(OrderDate) BETWEEN 2005 AND 2009 THEN '2005-2009' 
    WHEN Year(OrderDate) BETWEEN 2010 AND 2015 THEN '2010-2015' 
END AS Year 
From Orders 
Group by 
CASE WHEN Year(OrderDate) BETWEEN 2005 AND 2009 THEN '2005-2009' 
    WHEN Year(OrderDate) BETWEEN 2010 AND 2015 THEN '2010-2015' 
END 

Обратите внимание, что я настроил свои диапазоны дат, или вы бы не получить значимые данные, считая некоторые вещи в 2-х категориях.

+0

tombom; Итак, что, если у нас будет тонны данных. Есть ли какой-либо динамический подход вместо жесткого кодирования? Еще один момент, возможно, пользователь хочет указать диапазон. иногда 5 или 2 или что-то еще. –

+0

Вам нужно написать процедуру, в которой вы должны сначала создать оператор с динамическим sql. Но поскольку передача нескольких диапазонов дат в процедуру может быть затруднена, я бы не сделал этого на уровне базы данных. – fancyPants