[sql] 일별 그룹화 SQL 쿼리

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

Sales (saleID INT, amount INT, created DATETIME)


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



답변

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


답변

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)


답변

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)


답변

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

그래서:

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

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


답변

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.

마크


답변

오라클의 경우

group by trunc(created);

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

다른 옵션은

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

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


답변

PostgreSQL의 경우 :

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

또는 캐스트 사용 :

GROUP BY timestampfield::date

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

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