Запрос Sql к Группе за днем
Я хочу перечислить все продажи и группировать сумму за день.
Sales (saleID INT, amount INT, created DATETIME)
Обновление
Я использую SQL Server 2005
Ответы
Ответ 1
если вы используете SQL Server,
dateadd(DAY,0, datediff(day,0, created))
вернется созданный день
например, если продажа, созданная в 2009-11-02 06: 12: 55.000,
dateadd(DAY,0, datediff(day,0, created))
return '2009-11-02 00: 00: 00.000'
select sum(amount) as total, dateadd(DAY,0, datediff(day,0, created)) as created
from sales
group by dateadd(DAY,0, datediff(day,0, created))
Ответ 2
Для SQL Server:
GROUP BY datepart(year,datefield),
datepart(month,datefield),
datepart(day,datefield)
или быстрее (от Q8-Coder):
GROUP BY dateadd(DAY,0, datediff(day,0, created))
Для MySQL:
GROUP BY year(datefield), month(datefield), day(datefield)
или лучше (от Jon Bright):
GROUP BY date(datefield)
Для Oracle:
GROUP BY to_char(datefield, 'yyyy-mm-dd')
или быстрее (от IronGoofy):
GROUP BY trunc(created);
Для Informix (Джонатан Леффлер):
GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)
Ответ 3
Если вы используете MySQL:
SELECT
DATE(created) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
saledate
Если вы используете MS SQL 2008:
SELECT
CAST(created AS date) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
CAST(created AS date) AS saledate
Ответ 4
Если вы используете SQL Server, вы можете добавить три таблицы в таблицу:
Sales (saleID INT, amount INT, created DATETIME)
ALTER TABLE dbo.Sales
ADD SaleYear AS YEAR(Created) PERSISTED
ALTER TABLE dbo.Sales
ADD SaleMonth AS MONTH(Created) PERSISTED
ALTER TABLE dbo.Sales
ADD SaleDay AS DAY(Created) PERSISTED
и теперь вы можете легко группировать, заказывать и т.д. день, месяц или год продажи:
SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay
Эти рассчитанные поля всегда будут обновляться (когда изменяется ваша "Созданная" дата), они являются частью вашей таблицы, они могут использоваться как обычные поля и даже могут быть проиндексированы (если они "PERSISTED" ) - отличная особенность, которая полностью недоиспользована, ИМХО.
Марк
Ответ 5
на самом деле это зависит от того, какую СУБД вы используете, но в обычном SQL convert(varchar,DateColumn,101)
изменит формат DATETIME на сегодняшний день (один день)
так:
SELECT
sum(amount)
FROM
sales
GROUP BY
convert(varchar,created,101)
номер магии 101
- это формат даты, который он преобразует в
Ответ 6
Для оракула вы можете
group by trunc(created);
так как это сокращает созданное datetime до предыдущей полуночи.
Другой вариант -
group by to_char(created, 'DD.MM.YYYY');
который достигает одного и того же результата, но может быть медленнее, поскольку требует преобразования типа.
Ответ 7
Для PostgreSQL:
GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
или используя листинг:
GROUP BY timestampfield::date
если вы хотите скорость, используйте вторую опцию и добавьте индекс:
CREATE INDEX tablename_timestampfield_date_idx ON tablename(date(timestampfield));
Ответ 8
использовать linq
from c in Customers
group c by DbFunctions.TruncateTime(c.CreateTime) into date
orderby date.Key descending
select new
{
Value = date.Count().ToString(),
Name = date.Key.ToString().Substring(0, 10)
}