web-dev-qa-db-fra.com

Requête SQL à Groupe par jour

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

Sales (saleID INT, amount INT, created DATETIME)

Mise à jour J'utilise SQL Server 2005

115
mrblah

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))
143
Anwar Chandra

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)
98
Andomar

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)
33
Jon Bright

en fait, cela dépend du SGBD que vous utilisez, mais dans le langage SQL habituel, convert(varchar,DateColumn,101) modifiera le format DATETIME pour le mettre à jour (un jour)

alors:

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

le numéro de magix 101 est le format de date auquel il est converti

7
yopefonic

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 grouper par, commander par etc. par jour, mois ou année de la vente:

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

Ces champs calculés seront toujours tenus à jour (lorsque votre date "Créé" changera), ils feront partie de votre table, ils pourront être utilisés comme des champs normaux, et pourront même être indexés (s'ils sont "PERSISTED") ) - grande fonctionnalité qui est totalement sous-utilisé, à mon humble avis.

Marc

6
marc_s

Pour Oracle, vous pouvez

group by trunc(created);

car cela tronque la date/heure créée à minuit précédent.

Une autre option est de

group by to_char(created, 'DD.MM.YYYY');

ce qui donne le même résultat, mais peut être plus lent car il nécessite une conversion de type.

2
Thorsten

Pour PostgreSQL:

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

ou en utilisant la fonte:

GROUP BY timestampfield::date

si vous voulez de la vitesse, utilisez la deuxième option et ajoutez un index:

CREATE INDEX tablename_timestampfield_date_idx ON  tablename(date(timestampfield));
1
Francisco Valdez