일별 그룹화 SQL 쿼리


134

모든 판매를 나열하고 합계를 일별로 그룹화하고 싶습니다.

Sales (saleID INT, amount INT, created DATETIME)

SQL Server 2005를 사용중인 업데이트


4
날짜 함수가 SQL 언어와 다르므로 사용중인 데이터베이스를 지정해야합니다.
Guffa 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- 코더에서) :

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)


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

Andomar, 방금 MS SQL을 시도했습니다 (구문을 약간 조정 한 후). 날짜별로 행복하게 그룹화됩니다. 나도 갈 시간이없고 MySQL도 시험해 볼 수 있지만 하루 종일 사용하고 있으며 날짜별로 그룹화 될지 확실합니다.
Jon Bright

@ 존 브라이트 : 내 의견은 편집하기 전에 있었다. 현재 유형은 여전히 ​​올바르지 않습니다. 날짜 유형은 SQL Server 2008에서만 지원됩니다
Andomar

Andomar, 당신이 나를 확신시키지 못했기 때문에 나는 방금 MySQL을 점검했습니다. 날짜별로 완벽하게 그룹화됩니다.
Jon Bright

Andomar는 적어도 날짜 또는 마이크로 초로 그룹화하는 것과 관련하여 편집 결과와 기능적으로 차이가 없었습니다. 2008 만 날짜 시간을 지원하면 (보지 않음) 대답이 잘못되지는 않지만 MS SQL 2008에만 적용됩니다. 차이점이 있습니다.
Jon Bright

7

실제로 이것은 사용중인 DBMS에 따라 다르지만 일반 SQL convert(varchar,DateColumn,101)에서는 DATETIME 형식을 날짜 (하루)로 변경합니다

그래서:

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

magix 숫자 101는 변환되는 날짜 형식입니다.


2
+1 예, 101의 의미는 여기에 설명되어 있습니다. msdn.microsoft.com/en-us/library/ms187928.aspx
Andomar

7

SQL Server를 사용하는 경우 세 가지 계산 필드를 테이블에 추가 할 수 있습니다.

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"인 경우). )-완전히 사용되지 않는 훌륭한 기능, IMHO.

마크


네 확실합니다! 일, 월, 연도에 항상보고해야하는 경우에 매우 유용합니다. :-)
marc_s

2

오라클의 경우

group by trunc(created);

생성 된 날짜 시간을 이전 자정으로 자릅니다.

다른 옵션은

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

동일한 결과를 얻을 수 있지만 형식 변환이 필요할 때 속도가 느려질 수 있습니다.


아마도 Oracle에 따라 다르지만 매우 편리합니다. 또한 달의 첫날 등을 신속하게 줄 수있는 trunc (..., 'MONTH')도 있습니다.
Thorsten

2

PostgreSQL의 경우 :

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

또는 캐스트 사용 :

GROUP BY timestampfield::date

속도를 원한다면 두 번째 옵션을 사용하고 색인을 추가하십시오.

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.