sql >> データベース >  >> RDS >> Sqlserver

週、月、年ごとにグループ化されたレコードを返す SQL クエリ。レコードのない週は 0 を返す必要があります

    デモの目的 テーブル名を [DBO].[FACTINTERNETSALES] として使用し、列 [ORDERDATE] を使用しています。列は [CreatedDate].Fyi になります。これは SQL Server で行われます。

    DECLARE @START INT,
            @END INT
    
    SELECT @START   = CAST(CAST(MIN(ORDERDATE) AS DATETIME) AS INT) FROM [DBO].[FACTINTERNETSALES] 
    SELECT @END     = CAST(CAST(MAX(ORDERDATE) AS DATETIME) AS INT) FROM [DBO].[FACTINTERNETSALES] 
    
    --SELECT @START,@END
    
    DECLARE @DATEDIM TABLE (ID INT IDENTITY(1,1) PRIMARY KEY, DATED DATETIME)
    WHILE @START <= @END
    BEGIN
        INSERT INTO @DATEDIM VALUES (CAST(@START AS DATETIME))
        SET @START = @START  + 1 
    END
    
    SELECT      LU.WEEK,LU.MONTH,LU.YEAR,ISNULL(MAIN.COUNT,0) [COUNT]
    FROM        (
                SELECT      DATEPART(WEEK,DATED) [WEEK],DATEPART(MONTH,DATED) [MONTH],DATEPART(YEAR,DATED) [YEAR] 
                FROM        @DATEDIM
                GROUP BY    DATEPART(WEEK,DATED),DATEPART(MONTH,DATED),DATEPART(YEAR,DATED)) LU
    LEFT JOIN
                (
                SELECT  [YEAR],[MONTH],[WEEK],COUNT(*) [COUNT] FROM
                (SELECT DATEPART(YEAR,ORDERDATE) [YEAR],
                        DATEPART(MONTH,ORDERDATE) [MONTH],
                        DATEPART(WEEK,ORDERDATE) [WEEK]
                FROM    [DBO].[FACTINTERNETSALES] ) LUINNER
                GROUP BY [YEAR],[MONTH],[WEEK]) MAIN 
    ON
                LU.MONTH = MAIN.MONTH AND
                LU.YEAR = MAIN.YEAR AND
                LU.WEEK = MAIN.WEEK
    ORDER BY    LU.YEAR,LU.MONTH,LU.WEEK
    

    結果: (結果の一部のみ)




    1. PHPMySQLで508リソース制限に達した問題を修正する方法

    2. MySQLの制限されたTIMESTAMP範囲の回避策はありますか?

    3. MySQLは、あるテーブルの値を別のテーブルのレコードに連結します

    4. postgresqlクエリの大きなResultSet