web-dev-qa-db-ja.com

日ごとにグループ化するSQLクエリ

すべての売上をリストし、日ごとに合計をグループ化します。

Sales (saleID INT, amount INT, created DATETIME)

更新 SQL Server 2005を使用しています

115
mrblah

sQL Serverを使用している場合、

dateadd(DAY,0, datediff(day,0, created))は作成日を返します

たとえば、「2009-11-02 06:12:55.000」に作成されたセールの場合、dateadd(DAY,0, datediff(day,0, created))は「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

SQL Serverの場合:

GROUP BY datepart(year,datefield), 
    datepart(month,datefield), 
    datepart(day,datefield)

以上(Q8-Coderから):

GROUP BY dateadd(DAY,0, datediff(day,0, created))

MySQLの場合:

GROUP BY year(datefield), month(datefield), day(datefield)

またはより良い(ジョンブライトから):

GROUP BY date(datefield)

Oracleの場合:

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

以上(IronGoofyから):

GROUP BY trunc(created);

Informixの場合(ジョナサンレフラー):

GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)
98
Andomar

MySQLを使用している場合:

SELECT
    DATE(created) AS saledate,
    SUM(amount)
FROM
    Sales
GROUP BY
    saledate

MS SQL 2008を使用している場合:

SELECT
    CAST(created AS date) AS saledate,
    SUM(amount)
FROM
    Sales
GROUP BY
    CAST(created AS date)
33
Jon Bright

実際には、これは使用しているDBMSによって異なりますが、通常のSQLではconvert(varchar,DateColumn,101)はDATETIME形式を日付(1日)に変更します

そう:

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

magix番号101は、変換後の日付形式です

7
yopefonic

SQL Serverを使用している場合、3つの計算フィールドをテーブルに追加できます。

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

これで、販売日、月、または年ごとに簡単にグループ化、注文することができます。

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

これらの計算フィールドは常に最新の状態に保たれ(「作成」日付が変更された場合)、テーブルの一部であり、通常のフィールドと同様に使用でき、インデックスを付けることもできます(「PERSISTED」の場合) )-完全に未使用の素晴らしい機能、私見。

マーク

6
marc_s

Oracleの場合

group by trunc(created);

これにより、作成された日時が前の午前0時に切り捨てられます。

別のオプションは

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

同じ結果が得られますが、型変換が必要なため、処理が遅くなる場合があります。

2
Thorsten

PostgreSQLの場合:

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

またはキャストを使用して:

GROUP BY timestampfield::date

速度が必要な場合は、2番目のオプションを使用してインデックスを追加します。

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