Voglio elencare tutte le vendite e raggruppare la somma per giorno.
Sales (saleID INT, amount INT, created DATETIME)
Aggiornamento Sto usando SQL Server 2005
Voglio elencare tutte le vendite e raggruppare la somma per giorno.
Sales (saleID INT, amount INT, created DATETIME)
Aggiornamento Sto usando SQL Server 2005
Risposte:
se stai usando SQL Server,
dateadd(DAY,0, datediff(day,0, created))
restituirà il giorno creato
ad esempio, se la vendita creata in data "2009-11-02 06: 12: 55.000",
dateadd(DAY,0, datediff(day,0, created))
restituire "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))
Per SQL Server:
GROUP BY datepart(year,datefield),
datepart(month,datefield),
datepart(day,datefield)
o più veloce (da Q8-Coder):
GROUP BY dateadd(DAY,0, datediff(day,0, created))
Per MySQL:
GROUP BY year(datefield), month(datefield), day(datefield)
o meglio (da Jon Bright):
GROUP BY date(datefield)
Per Oracle:
GROUP BY to_char(datefield, 'yyyy-mm-dd')
o più veloce (da IronGoofy):
GROUP BY trunc(created);
Per Informix (di Jonathan Leffler):
GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)
Se stai usando MySQL:
SELECT
DATE(created) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
saledate
Se stai usando MS SQL 2008:
SELECT
CAST(created AS date) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
CAST(created AS date)
in realtà questo dipende da quale DBMS stai usando, ma in SQL normale convert(varchar,DateColumn,101)
cambierà il formato DATETIME fino ad oggi (un giorno)
così:
SELECT
sum(amount)
FROM
sales
GROUP BY
convert(varchar,created,101)
il numero magix 101
è il formato di data in cui viene convertito
Se si utilizza SQL Server, è possibile aggiungere tre campi calcolati alla tabella:
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
e ora puoi facilmente raggruppare, ordinare per ecc. per giorno, mese o anno di vendita:
SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay
Quei campi calcolati saranno sempre aggiornati (quando la tua data "Creata" cambia), fanno parte della tua tabella, possono essere usati proprio come i campi normali e possono anche essere indicizzati (se sono "PERSISTATI" ) - grande funzionalità totalmente sottoutilizzata, IMHO.
Marc
Per oracolo puoi
group by trunc(created);
poiché ciò tronca il datetime creato alla mezzanotte precedente.
Un'altra opzione è quella di
group by to_char(created, 'DD.MM.YYYY');
che ottiene lo stesso risultato, ma può essere più lento in quanto richiede una conversione del tipo.
Per PostgreSQL:
GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
o usando il cast:
GROUP BY timestampfield::date
se vuoi la velocità, usa la seconda opzione e aggiungi un indice:
CREATE INDEX tablename_timestampfield_date_idx ON tablename(date(timestampfield));
usa 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)
}