Запрос 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)
}