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

月次レポートのグループごとの TSQL 合計

    このクエリを試してください

    特定の年の月ごとにグループ化が行われるように、日付から年と月の部分を抽出しました。

    select 
       shipping_company, 
       SUBSTRING(ship_date, 1, 6), 
       shipping_category, 
       sum(convert(decimal(10,2),shipping_cost))
    from 
       tbl
    group by 
       shipping_company, 
       SUBSTRING(ship_date, 1, 6), 
       shipping_category
     

    SQL FIDDLE :

    <プレ>| SHIPPING_COMPANY | COLUMN_1 | SHIPPING_CATEGORY | COLUMN_3 | -------------------------------------------------------------- | DHL | 201201 | CD'S | 6.5 | | DHL | 201202 | CD'S | 5.5 | | DHL | 201203 | CD'S | 46.5 | | DHL | 201205 | CD'S | 3.5 | | DHL | 201303 | CD'S | 3.5 | | DHL | 201304 | CD'S | 8 | | DHL | 201305 | CD'S | 4.5 | | UPS | 201203 | CD'S | 5.5 | | UPS | 201203 | Records | 4.5 | | UPS | 201203 | Tapes | 3.5 | | UPS | 201303 | CD'S | 18 | | UPS | 201303 | Records | 4.5 | | UPS | 201303 | Tapes | 12.44 | | USPS | 201203 | CD'S | 68 | | USPS | 201302 | CD'S | 36.5 | | USPS | 201303 | CD'S | 37 |

    年間合計が必要な場合は、 WITH ROLLUP を使用できます .

    注意 年間合計を月間合計として考えてください...

    クエリ 1 :

    select  
    CASE WHEN (GROUPING(shipping_company) = 1) THEN 'TOTAL'
                ELSE shipping_company END AS shipping_company,
    CASE WHEN (GROUPING(SUBSTRING(ship_date, 1, 6)) = 1) THEN 'TOTAL'
                ELSE SUBSTRING(ship_date, 1, 6) END AS Date,
    CASE WHEN (GROUPING(shipping_category) = 1) THEN 'Yearly TOTAL'
                ELSE shipping_category END AS shipping_category,
    sum(convert(decimal(10,2),shipping_cost))
    from tbl
    group by shipping_company, SUBSTRING(ship_date, 1, 6), 
    shipping_category WITH rollup
     

    SQL FIDDLE :

    <プレ>| SHIPPING_COMPANY | DATE | SHIPPING_CATEGORY | COLUMN_3 | ------------------------------------------------------------ | DHL | 201201 | CD'S | 6.5 | | DHL | 201201 | Yearly TOTAL | 6.5 | | DHL | 201202 | CD'S | 5.5 | | DHL | 201202 | Yearly TOTAL | 5.5 | | DHL | 201203 | CD'S | 46.5 | | DHL | 201203 | Yearly TOTAL | 46.5 | | DHL | 201205 | CD'S | 3.5 | | DHL | 201205 | Yearly TOTAL | 3.5 | | DHL | 201303 | CD'S | 3.5 | | DHL | 201303 | Yearly TOTAL | 3.5 | | DHL | 201304 | CD'S | 8 | | DHL | 201304 | Yearly TOTAL | 8 | | DHL | 201305 | CD'S | 4.5 | | DHL | 201305 | Yearly TOTAL | 4.5 | | DHL | TOTAL | Yearly TOTAL | 78 | | UPS | 201203 | CD'S | 5.5 | | UPS | 201203 | Records | 4.5 | | UPS | 201203 | Tapes | 3.5 | | UPS | 201203 | Yearly TOTAL | 13.5 | | UPS | 201303 | CD'S | 18 | | UPS | 201303 | Records | 4.5 | | UPS | 201303 | Tapes | 12.44 | | UPS | 201303 | Yearly TOTAL | 34.94 | | UPS | TOTAL | Yearly TOTAL | 48.44 | | USPS | 201203 | CD'S | 68 | | USPS | 201203 | Yearly TOTAL | 68 | | USPS | 201302 | CD'S | 36.5 | | USPS | 201302 | Yearly TOTAL | 36.5 | | USPS | 201303 | CD'S | 37 | | USPS | 201303 | Yearly TOTAL | 37 | | USPS | TOTAL | Yearly TOTAL | 141.5 | | TOTAL | TOTAL | Yearly TOTAL | 267.94 |

    編集

    更新されたクエリで問題が発生しました。 If ステートメントの両方のケースは結果の同じデータ型を返す必要があるため、日付値を数値にキャストしようとすると、真のケースは varchar を返します TOTAL である datatype フィールド else フィールドは numeric を返します タイプ フィールドなので、これによりエラーが発生します。

    それを解決するには、ケースステートメントを削除する必要があります。そうすれば、必要に応じて適切に機能します。

    select  
    CASE WHEN (GROUPING(shipping_company) = 1) THEN 'TOTAL'
                ELSE shipping_company END AS shipping_company,
    CONVERT(numeric, (SUBSTRING(ship_date, 1, 6))) AS Date,
    CASE WHEN (GROUPING(shipping_category) = 1) THEN 'Yearly TOTAL'
                ELSE shipping_category END AS shipping_category,
    sum(convert(decimal(10,2),shipping_cost))
    from tbl
    group by shipping_company, (CONVERT(numeric, SUBSTRING(ship_date, 1, 6))), 
    shipping_category WITH rollup
     

    SQL FIDDLE :

    <プレ>| SHIPPING_COMPANY | DATE | SHIPPING_CATEGORY | COLUMN_3 | ------------------------------------------------------------ | DHL | 201201 | CD'S | 6.5 | | DHL | 201201 | Yearly TOTAL | 6.5 | | DHL | 201202 | CD'S | 5.5 | | DHL | 201202 | Yearly TOTAL | 5.5 | | DHL | 201203 | CD'S | 46.5 | | DHL | 201203 | Yearly TOTAL | 46.5 | | DHL | 201205 | CD'S | 3.5 | | DHL | 201205 | Yearly TOTAL | 3.5 | | DHL | 201303 | CD'S | 3.5 | | DHL | 201303 | Yearly TOTAL | 3.5 | | DHL | 201304 | CD'S | 8 | | DHL | 201304 | Yearly TOTAL | 8 | | DHL | 201305 | CD'S | 4.5 | | DHL | 201305 | Yearly TOTAL | 4.5 | | DHL | (null) | Yearly TOTAL | 78 | | UPS | 201203 | CD'S | 5.5 | | UPS | 201203 | Records | 4.5 | | UPS | 201203 | Tapes | 3.5 | | UPS | 201203 | Yearly TOTAL | 13.5 | | UPS | 201303 | CD'S | 18 | | UPS | 201303 | Records | 4.5 | | UPS | 201303 | Tapes | 12.44 | | UPS | 201303 | Yearly TOTAL | 34.94 | | UPS | (null) | Yearly TOTAL | 48.44 | | USPS | 201203 | CD'S | 68 | | USPS | 201203 | Yearly TOTAL | 68 | | USPS | 201302 | CD'S | 36.5 | | USPS | 201302 | Yearly TOTAL | 36.5 | | USPS | 201303 | CD'S | 37 | | USPS | 201303 | Yearly TOTAL | 37 | | USPS | (null) | Yearly TOTAL | 141.5 | | TOTAL | (null) | Yearly TOTAL | 267.94 |

    そのため、日付列の null 値に耐える必要があります。これで疑問が解消されることを願っています。

    これがお役に立てば幸いです......




    1. JSP、MySQL、UTF-8

    2. hibernate map java Long toMySQLBIGINTエラー

    3. 選択、変更、および同じテーブルへの挿入

    4. mySQLMAX値をJava変数に設定します