152 votes

Requête SQL à Groupe par jour

Je veux énumérer toutes les ventes et regrouper la somme par jour.

Ventes (saleID INT, montant INT, créé DATETIME)

Mise à jour j'utilise SQL Server 2005

187voto

Anwar Chandra Points 4341

si vous utilisez SQL Server,

dateadd(DAY,0, datediff(day,0, created)) retournera le jour créé

par exemple, si la vente créée le '2009-11-02 06: 12: 55.000', dateadd(DAY,0, datediff(day,0, created)) return '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))
 

129voto

Andomar Points 115404

Pour SQL Server:

 GROUP BY datepart(year,datefield), 
    datepart(month,datefield), 
    datepart(day,datefield)
 

ou plus rapide (à partir de Q8-Coder):

 GROUP BY dateadd(DAY,0, datediff(day,0, created))
 

Pour MySQL:

 GROUP BY year(datefield), month(datefield), day(datefield)
 

ou mieux (de Jon Bright):

 GROUP BY date(datefield)
 

Pour Oracle:

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

ou plus rapide (d'IronGoofy):

 GROUP BY trunc(created);
 

Pour Informix (par Jonathan Leffler):

 GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)
 

55voto

Jon Bright Points 6834

Si vous utilisez MySQL:

 SELECT
    DATE(created) AS saledate,
    SUM(amount)
FROM
    Sales
GROUP BY
    saledate
 

Si vous utilisez MS SQL 2008:

 SELECT
    CAST(created AS date) AS saledate,
    SUM(amount)
FROM
    Sales
GROUP BY
    CAST(created AS date) AS saledate
 

7voto

yopefonic Points 312

En fait, cela dépend du SGBD que vous utilisez, mais en SQL normal, convert(varchar,DateColumn,101) changera le format DATETIME à ce jour (un jour)

alors:

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

le nombre magix 101 est le format de date auquel il est converti

6voto

marc_s Points 321990

Si vous utilisez SQL Server, vous pouvez ajouter trois champs calculés à votre table:

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

et maintenant vous pouvez facilement group by, order by, etc. par jour, du mois ou de l'année de la vente:

SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay

Ces champs calculés seront toujours mis à jour (lorsque votre "Créé" changement de date), ils font partie de votre table, ils peuvent être utilisés comme des champs, et peut même être indexé (si ils sont "PERSISTANTES") - une grande fonctionnalité qui est totalement sous-exploité, à mon humble avis.

Marc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X