このクエリを試してください
特定の年の月ごとにグループ化が行われるように、日付から年と月の部分を抽出しました。
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 値に耐える必要があります。これで疑問が解消されることを願っています。
これがお役に立てば幸いです......