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.
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.
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))
W przypadku programu SQL Server:
GROUP BY datepart(year,datefield),
datepart(month,datefield),
datepart(day,datefield)
lub szybszy (z Q8-Coder):
GROUP BY dateadd(DAY,0, datediff(day,0, created))
W przypadku MySQL:
GROUP BY year(datefield), month(datefield), day(datefield)
lub lepiej (od Jona Brighta):
GROUP BY date(datefield)
W przypadku Oracle:
GROUP BY to_char(datefield, 'yyyy-mm-dd')
lub szybciej (z IronGoofy):
GROUP BY trunc(created);
Informix (autor: Jonathan Leffler):
GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)
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)
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
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
Dla wyroczni możesz
group by trunc(created);
ponieważ powoduje to obcięcie utworzonej daty i godziny do poprzedniej północy.
Inną opcją jest
group by to_char(created, 'DD.MM.YYYY');
który daje ten sam wynik, ale może być wolniejszy, ponieważ wymaga konwersji typu.
W przypadku PostgreSQL:
GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
lub używając obsady:
GROUP BY timestampfield::date
jeśli chcesz szybkości, użyj drugiej opcji i dodaj indeks:
CREATE INDEX tablename_timestampfield_date_idx ON tablename(date(timestampfield));
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)
}