programing

일별로 그룹화할 SQL 쿼리

codeshow 2023. 4. 7. 21:44
반응형

일별로 그룹화할 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-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')

이상(IronGuofy에서):

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)

포스트그레용SQL:

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

또는 캐스트 사용:

GROUP BY timestampfield::date

속도를 원하는 경우 두 번째 옵션을 사용하여 인덱스를 추가합니다.

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

실제로는 사용하는 DBMS에 따라 다르지만 일반 SQL에서는convert(varchar,DateColumn,101)DATETIME 형식을 최신(1일)으로 변경합니다.

따라서:

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

매직스 넘버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"인 경우 색인화할 수도 있습니다.이는 완전히 사용되지 않는 뛰어난 기능입니다.

마크

오라클의 경우

group by trunc(created);

생성된 날짜 시간이 이전 자정으로 잘리기 때문입니다.

또 다른 방법은

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

같은 결과를 얻을 수 있지만 유형 변환이 필요하기 때문에 속도가 느려질 수 있습니다.

MySQL을 위한 가장 심플하고 직관적인 솔루션은 다음과 같습니다.

GROUP BY day(datefield)

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

언급URL : https://stackoverflow.com/questions/1658340/sql-query-to-group-by-day

반응형