Tüm satışları listelemek ve toplamı güne göre gruplamak istiyorum.
Sales (saleID INT, amount INT, created DATETIME)
Güncelleştirme SQL Server 2005 kullanıyorum
Tüm satışları listelemek ve toplamı güne göre gruplamak istiyorum.
Sales (saleID INT, amount INT, created DATETIME)
Güncelleştirme SQL Server 2005 kullanıyorum
Yanıtlar:
SQL Server kullanıyorsanız,
dateadd(DAY,0, datediff(day,0, created))
oluşturulan günü döndürecek
örneğin, satış '2009-11-02 06: 12: 55.000' tarihinde oluşturulmuşsa,
dateadd(DAY,0, datediff(day,0, created))
'2009-11-02 00: 00: 00.000' döndür
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))
SQL Server için:
GROUP BY datepart(year,datefield),
datepart(month,datefield),
datepart(day,datefield)
veya daha hızlı (Q8-Coder'dan):
GROUP BY dateadd(DAY,0, datediff(day,0, created))
MySQL için:
GROUP BY year(datefield), month(datefield), day(datefield)
veya daha iyisi (Jon Bright'tan):
GROUP BY date(datefield)
Oracle için:
GROUP BY to_char(datefield, 'yyyy-mm-dd')
veya daha hızlı (IronGoofy'den):
GROUP BY trunc(created);
Informix için (Jonathan Leffler):
GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)
MySQL kullanıyorsanız:
SELECT
DATE(created) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
saledate
MS SQL 2008 kullanıyorsanız:
SELECT
CAST(created AS date) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
CAST(created AS date)
aslında bu, kullandığınız DBMS'ye bağlıdır, ancak normal SQL'de convert(varchar,DateColumn,101)
DATETIME biçimini bugüne kadar değiştirir (bir gün)
yani:
SELECT
sum(amount)
FROM
sales
GROUP BY
convert(varchar,created,101)
büyülü sayı 101
, dönüştürüldüğü tarih biçimidir
SQL Server kullanıyorsanız, tablonuza üç hesaplanan alan ekleyebilirsiniz:
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
ve şimdi satış gününe, ayına veya yılına göre kolayca gruplayabilir, sıralayabilirsiniz:
SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay
Bu hesaplanan alanlar her zaman güncel tutulur ("Oluşturulma" tarihiniz değiştiğinde), tablonuzun parçasıdırlar, normal alanlar gibi kullanılabilirler ve hatta dizine alınabilir ("DEVAMLI" ise) ) - tamamen az kullanılan harika bir özellik, IMHO.
üzüm posası
Oracle için yapabilirsin
group by trunc(created);
çünkü bu, oluşturulan tarih saatini önceki gece yarısına kadar kısaltır.
Başka bir seçenek de
group by to_char(created, 'DD.MM.YYYY');
aynı sonucu verir, ancak bir tür dönüşümü gerektirdiğinden daha yavaş olabilir.
PostgreSQL için:
GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
veya cast kullanarak:
GROUP BY timestampfield::date
hız istiyorsanız, ikinci seçeneği kullanın ve bir dizin ekleyin:
CREATE INDEX tablename_timestampfield_date_idx ON tablename(date(timestampfield));
linq kullan
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)
}