日ごとのグループへのSQLクエリ


134

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

Sales (saleID INT, amount INT, created DATETIME)

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


4
日付関数はSQL方言で異なるため、使用しているデータベースを指定する必要があります。
グッファ2009年

日ごとのグループ化の詳細については、こちらをご覧ください。sqlserverlearner.com/2012/group-by-day-with-examples

回答:


164

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))

頭から離れて、この方法を設計する方が効率的ですか、それともDATEを使用して直接それにグループ化する方が効率的ですか?
Sinaesthetic

要件に依存する@Sinaesthetic。
アンワーチャンドラ

108

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)

以上(Jon Brightから):

GROUP BY date(datefield)

Oracleの場合:

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

以上(IronGoofyから):

GROUP BY trunc(created);

Informix(Jonathan Leffler)の場合:

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

さまざまな構文をすべてリストしていただきありがとうございます
CTS_AE 2013年

43

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)

5
これらの例はマイクロ秒でグループ化されると
思い

Andomar、私はMS SQLを試してみました(構文を少し調整した後)。ここでは日付ごとに楽しくグループ分けされています。私もMySQLを試す時間はありませんが、一日の仕事で終日使用しており、日付でグループ化されることもほぼ確実です。
ジョンブライト

@ジョン・ブライト:私のコメントは編集前でした。現在のものはまだ正しくありません。日付タイプはSQL Server 2008でのみサポートされています
-Andomar

Andomar、あなたが私を不確かにしたので、私はMySQLもチェックしました。完全に機能し、日付ごとにグループ化されます。
ジョンブライト

Andomar氏、編集により、少なくとも日付またはマイクロ秒でグループ化することに関しては、結果に機能的な違いはありませんでした。2008のみが日付時刻をサポートしている場合(私は見ていません)、それは答えを不正確にしないわけではありません。MSSQL 2008にのみ適用されます。違いがあります。
ジョンブライト

7

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

そう:

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

magix数101は、変換される日付形式です。



7

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

これらの計算フィールドは常に最新の状態に保たれ(「作成」日が変更された場合)、それらはテーブルの一部であり、通常のフィールドと同じように使用でき、インデックスを作成することもできます(「永続化」されている場合) )-完全に活用されていない素晴らしい機能、IMHO。

マーク


はい、そうです!日、月、年を常に報告する必要がある場合に非常に役立ちます:-)
marc_s 2009年

2

オラクルの場合は、

group by trunc(created);

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

別のオプションは

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

同じ結果が得られますが、型変換が必要なため、速度が遅くなる可能性があります。


これはおそらくOracle固有のものですが、非常に便利です。TRUNCは(...、「MONTH」)はすぐにあなたになど月の最初の日与えることもあります
トルステン

2

PostgreSQLの場合:

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

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

GROUP BY timestampfield::date

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

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

-3

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)
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.