Я хочу перечислить все продажи и сгруппировать сумму по дням.
Sales (saleID INT, amount INT, created DATETIME)
Обновление, я использую SQL Server 2005
Я хочу перечислить все продажи и сгруппировать сумму по дням.
Sales (saleID INT, amount INT, created DATETIME)
Обновление, я использую SQL Server 2005
Ответы:
если вы используете 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))
Для 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)
Если вы используете 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)
на самом деле это зависит от того, какую СУБД вы используете, но в обычном SQL convert(varchar,DateColumn,101)
изменит формат DATETIME на дату (один день)
так:
SELECT
sum(amount)
FROM
sales
GROUP BY
convert(varchar,created,101)
число magix 101
- это формат даты, в который он конвертируется
Если вы используете 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
Эти вычисляемые поля всегда будут обновляться (при изменении даты "Создано"), они являются частью вашей таблицы, их можно использовать так же, как обычные поля, и даже их можно индексировать (если они "ПРОДОЛЖАЮТСЯ" ) - отличная функция, которая полностью не используется, ИМХО.
Марк
Для оракула вы можете
group by trunc(created);
поскольку это усекает созданное datetime до предыдущей полуночи.
Другой вариант заключается в
group by to_char(created, 'DD.MM.YYYY');
который дает тот же результат, но может быть медленнее, поскольку требует преобразования типа.
Для PostgreSQL:
GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
или используя cast:
GROUP BY timestampfield::date
если вам нужна скорость, используйте второй вариант и добавьте индекс:
CREATE INDEX tablename_timestampfield_date_idx ON tablename(date(timestampfield));
использовать 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)
}