Quero listar todas as vendas e agrupar a soma por dia.
Sales (saleID INT, amount INT, created DATETIME)
Atualização Estou usando o SQL Server 2005
Quero listar todas as vendas e agrupar a soma por dia.
Sales (saleID INT, amount INT, created DATETIME)
Atualização Estou usando o SQL Server 2005
Respostas:
se você estiver usando o SQL Server,
dateadd(DAY,0, datediff(day,0, created))
retornará o dia criado
por exemplo, se a venda criada em '2009-11-02 06: 12: 55.000',
dateadd(DAY,0, datediff(day,0, created))
retorne '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))
Para o SQL Server:
GROUP BY datepart(year,datefield),
datepart(month,datefield),
datepart(day,datefield)
ou mais rápido (do Q8-Coder):
GROUP BY dateadd(DAY,0, datediff(day,0, created))
Para o MySQL:
GROUP BY year(datefield), month(datefield), day(datefield)
ou melhor (de Jon Bright):
GROUP BY date(datefield)
Para Oracle:
GROUP BY to_char(datefield, 'yyyy-mm-dd')
ou mais rápido (da IronGoofy):
GROUP BY trunc(created);
Para Informix (de Jonathan Leffler):
GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)
Se você estiver usando o MySQL:
SELECT
DATE(created) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
saledate
Se você estiver usando o MS SQL 2008:
SELECT
CAST(created AS date) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
CAST(created AS date)
na verdade, isso depende do DBMS que você está usando, mas no SQL regular convert(varchar,DateColumn,101)
, o formato DATETIME será alterado para data (um dia)
tão:
SELECT
sum(amount)
FROM
sales
GROUP BY
convert(varchar,created,101)
o número magix 101
é para qual formato de data é convertido
Se você estiver usando o SQL Server, poderá adicionar três campos calculados à sua tabela:
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 agora você pode facilmente agrupar, ordenar por etc. por dia, mês ou ano da venda:
SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay
Esses campos calculados serão sempre atualizados (quando a data "Criada" for alterada), eles fazem parte da sua tabela, podem ser usados como campos regulares e podem até ser indexados (se estiverem "PERSISTED" ) - ótimo recurso totalmente subutilizado, IMHO.
Marc
Para oracle você pode
group by trunc(created);
pois isso trunca o datetime criado para a meia-noite anterior.
Outra opção é
group by to_char(created, 'DD.MM.YYYY');
que alcança o mesmo resultado, mas pode ser mais lento, pois requer uma conversão de tipo.
Para o PostgreSQL:
GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
ou usando elenco:
GROUP BY timestampfield::date
se você deseja velocidade, use a segunda opção e adicione um índice:
CREATE INDEX tablename_timestampfield_date_idx ON tablename(date(timestampfield));
use 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)
}