Prøv denne forespørgsel
Jeg har udtrukket del af år og måned fra datoen, så gruppering sker for hver måned i det pågældende år.
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 |
Hvis du vil have et årligt totalbeløb, kan du bruge WITH ROLLUP
.
BEMÆRK Betragt årlig total som månedlig total...
Forespørgsel 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 |
REDIGER
Okay fik dit problem i dine opdaterede forespørgsler. Begge tilfælde af If-sætning bør returnere samme datatype af resultat, så når du forsøger at caste datoværdierne tilbage til numeriske, returnerer din sande tilfælde varchar
datatypefelt, som er TOTAL
og feltet andet returnerer en numeric
type felt, så dette forårsager fejlen.
For at løse det skal du fjerne sagserklæringen, så ville den fungere korrekt efter dit behov.
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 |
Så nu skal du bære med null-værdier i datokolonnerne. Håber dette besvarer din tvivl.
Håber dette hjælper......