Je veux lister toutes les ventes et regrouper la somme par jour.
Sales (saleID INT, amount INT, created DATETIME)
Mise à jour J'utilise SQL Server 2005
Je veux lister toutes les ventes et regrouper la somme par jour.
Sales (saleID INT, amount INT, created DATETIME)
Mise à jour J'utilise SQL Server 2005
Réponses:
si vous utilisez SQL Server,
dateadd(DAY,0, datediff(day,0, created))
retournera le jour créé
par exemple, si la vente a été créée le '2009-11-02 06: 12: 55.000',
dateadd(DAY,0, datediff(day,0, created))
renvoyez '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))
Pour SQL Server:
GROUP BY datepart(year,datefield),
datepart(month,datefield),
datepart(day,datefield)
ou plus rapide (depuis 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 (à partir d'IronGoofy):
GROUP BY trunc(created);
Pour Informix (par Jonathan Leffler):
GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)
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)
en fait, cela dépend du SGBD que vous utilisez, mais en SQL normal convert(varchar,DateColumn,101)
, le format DATETIME sera modifié à 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 dans lequel il est converti
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 regrouper, classer 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éé" change), ils font partie de votre table, ils peuvent être utilisés comme des champs normaux, et peuvent même être indexés (s'ils sont "PERSISTÉS" ) - excellente fonctionnalité qui est totalement sous-utilisée, à mon humble avis.
Marc
Pour oracle, vous pouvez
group by trunc(created);
car cela tronque le datetime créé à minuit précédent.
Une autre option consiste à
group by to_char(created, 'DD.MM.YYYY');
qui permet d'obtenir le même résultat, mais peut être plus lent car il nécessite une conversion de type.
Pour PostgreSQL:
GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
ou en utilisant cast:
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));
utiliser 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)
}