Sql запрос в группу по дням - PullRequest
112 голосов
/ 02 ноября 2009

Я хочу перечислить все продажи и сгруппировать сумму по дням.

Sales (saleID INT, amount INT, created DATETIME)

Обновление Я использую SQL Server 2005

Ответы [ 8 ]

140 голосов
/ 02 ноября 2009

, если вы используете SQL Server,

dateadd(DAY,0, datediff(day,0, created)) вернет созданный день

например, если продажа создана '2009-11-02 06: 12: 55.000', dateadd(DAY,0, datediff(day,0, created)) возврат '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))
95 голосов
/ 02 ноября 2009

Для 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)

или лучше (от Джона Брайта):

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)
32 голосов
/ 02 ноября 2009

Если вы используете 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)
6 голосов
/ 02 ноября 2009

Если вы используете 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") - отличная функция, которая полностью не используется, ИМХО.

Марк

6 голосов
/ 02 ноября 2009

на самом деле это зависит от того, какую СУБД вы используете, но в обычном SQL convert(varchar,DateColumn,101) изменит формат DATETIME на дату (один день)

так:

SELECT 
    sum(amount) 
FROM 
    sales 
GROUP BY 
    convert(varchar,created,101)

число magix 101 - это какой формат даты конвертируется в

2 голосов
/ 02 ноября 2009

Для оракула вы можете

group by trunc(created);

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

Другой вариант -

group by to_char(created, 'DD.MM.YYYY');

, который достигает того же результата, но может быть медленнее, поскольку требует преобразования типа.

1 голос
/ 22 января 2013

Для PostgreSQL:

GROUP BY to_char(timestampfield, 'yyyy-mm-dd')

или используя приведение:

GROUP BY timestampfield::date

если вы хотите скорость, используйте второй параметр и добавьте индекс:

CREATE INDEX tablename_timestampfield_date_idx ON  tablename(date(timestampfield));
0 голосов
/ 26 декабря 2014

используйте 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)
}
...