2014-11-04 2 views
1

У меня есть таблица, которая представляет собой журнал заказов с itemID и orderTimedatetime). Я знаю, что может получить заказы конкретных предметов на определенный день, как:SQL- Количество раз, когда каждый элемент заказывается каждый день

select 
    itemID, count(itemID) as Sep14 
from 
    tableName 
where 
    itemID in (5, 6, 9) 
    and orderTime between 'sep 14 2014 00:00:01' and 'sep 14 2014 23:59:59' 
group by 
    itemID 

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

itemiD Sep14 Sep15 Sep16 
------ ----- ----- ----- 
5  0  2  1 
6  3  3  0 
9  2  1  2 

Любая помощь очень ценится.

+0

Какой db вы используете? MySql? Сервер Sql? – Eric

+0

Это в SQL Server – dotMPEG

+1

Пожалуйста, не используйте 'BETWEEN' и« конец »дня, как 23:59:59 (так как заказ может состояться в 23: 59: 59.01). Пожалуйста, прочитайте [это] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx) и [это] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx). –

ответ

2
select itemID, convert(DATE, orderTime), count(*) 
from tableName 
where itemID in (5, 6, 9) 
and (orderTime > 'sep 14 2014 00:00:00' and orderTime < 'sep 21 2014 00:0:00') 
group by itemId, convert(DATE, orderTime) 

Это даст вам результаты по одной строке в день. Если вы попытаетесь получить один столбец в день, это не будет масштабироваться.

+0

Мне нужно запустить для определенного подмножества элементов и между определенным диапазоном дат. – dotMPEG

+1

@dotMPEG Итак, добавьте предложения WHERE. Это не влияет на то, как данные группируются, агрегируются и возвращаются, за исключением того, что они смотрят только на нужные вам строки. Если вам нужно перевернуть результаты в сторону, вы можете использовать PIVOT (но это будет больно, потому что вам нужно будет динамически назвать столбцы дня) или сделать это в инструменте приложения/отчетности (что должно быть проще). –

+0

Я добавил предложение where, чтобы проиллюстрировать, как вы можете ограничить свои результаты конкретными элементами и датами. – Eric

0

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

DECLARE @StartDate date = '20140101' 
DECLARE @EndDate date = '20140102' 

DECLARE @PivotColumnHeaders varchar(MAX) 
SELECT @PivotColumnHeaders = 
    COALESCE(
    @PivotColumnHeaders + ',[' + CONVERT(varchar(10),uc.orderTime,110) + ']', 
    '[' + CONVERT(varchar(10),uc.orderTime,110) + ']' 
) 
FROM (SELECT DISTINCT orderTime FROM tablename WHERE orderTime BETWEEN @StartDate AND @EndDate) UC 

DECLARE @PQuery varchar(MAX) = ' 
SELECT * FROM (SELECT ID, CAST(orderTime as date), Value FROM tablename T0 WHERE CAST(OrderTime as date) BETWEEN ''' + CONVERT(varchar(10),@StartDate,110) + ''' AND ''' + CONVERT(varchar(10),@EndDate,110) +''') T1 
PIVOT (COUNT([Value]) FOR CAST(orderTime as date) IN (' + @PivotColumnHeaders + ')) AS P' 
EXECUTE (@PQuery) 
Смежные вопросы