Chcę wymienić wszystkie sprzedaże i pogrupować sumę według dni.
Sales (saleID INT, amount INT, created DATETIME)
UWAGA: używam programu SQL Server 2005.
sql
sql-server
sql-server-2005
group-by
mrblah
źródło
źródło
Odpowiedzi:
jeśli używasz SQL Server,
dateadd(DAY,0, datediff(day,0, created))
zwróci utworzony dzieńna przykład, jeśli sprzedaż utworzona dnia „2009-11-02 06: 12: 55.000”,
dateadd(DAY,0, datediff(day,0, created))
zwraca „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))
źródło
W przypadku programu SQL Server:
lub szybszy (z Q8-Coder):
W przypadku MySQL:
lub lepiej (od Jona Brighta):
W przypadku Oracle:
lub szybciej (z IronGoofy):
Informix (autor: Jonathan Leffler):
źródło
Jeśli używasz MySQL:
SELECT DATE(created) AS saledate, SUM(amount) FROM Sales GROUP BY saledate
Jeśli używasz MS SQL 2008:
SELECT CAST(created AS date) AS saledate, SUM(amount) FROM Sales GROUP BY CAST(created AS date)
źródło
faktycznie zależy to od używanego DBMS, ale w zwykłym SQL
convert(varchar,DateColumn,101)
zmieni aktualny format DATETIME (jeden dzień)więc:
SELECT sum(amount) FROM sales GROUP BY convert(varchar,created,101)
liczba magix
101
to format daty, na który jest konwertowanaźródło
Jeśli używasz SQL Server, możesz dodać do swojej tabeli trzy pola obliczeniowe:
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
a teraz możesz łatwo grupować, zamawiać itp. według dnia, miesiąca lub roku sprzedaży:
SELECT SaleDay, SUM(Amount) FROM dbo.Sales GROUP BY SaleDay
Te pola obliczeniowe będą zawsze aktualne (gdy zmieni się data utworzenia), są częścią tabeli, można ich używać tak jak zwykłych pól, a nawet indeksować (jeśli są „UTRWALONE” ) - świetna funkcja, która jest całkowicie niedostatecznie wykorzystywana, IMHO.
Marc
źródło
Dla wyroczni możesz
ponieważ powoduje to obcięcie utworzonej daty i godziny do poprzedniej północy.
Inną opcją jest
który daje ten sam wynik, ale może być wolniejszy, ponieważ wymaga konwersji typu.
źródło
W przypadku PostgreSQL:
lub używając obsady:
jeśli chcesz szybkości, użyj drugiej opcji i dodaj indeks:
CREATE INDEX tablename_timestampfield_date_idx ON tablename(date(timestampfield));
źródło
użyj 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) }
źródło