Я хочу перерахувати всі продажі та згрупувати суму за днями.
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
Ці обчислені поля завжди будуть постійно оновлюватися (коли змінено дату "Створено"), вони є частиною вашої таблиці, вони можуть використовуватися як звичайні поля, і навіть можуть бути індексовані (якщо вони "ПЕРСПЕКТИВНІ" ) - відмінна функція, яка повністю використовується, IMHO.
Марк
Для оракул можна
group by trunc(created);
оскільки це скорочує створене дату до попередньої півночі.
Інший варіант - це
group by to_char(created, 'DD.MM.YYYY');
який досягає того ж результату, але може бути повільнішим, оскільки вимагає перетворення типу.
Для PostgreSQL:
GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
або з використанням ролях:
GROUP BY timestampfield::date
якщо ви хочете швидкості, використовуйте другий варіант і додайте індекс:
CREATE INDEX tablename_timestampfield_date_idx ON tablename(date(timestampfield));