Pruebe esta consulta
He extraído la parte del año y el mes de la fecha, por lo que la agrupación se realiza para cada mes de un año en particular.
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 |
Si desea un total anual, puede usar WITH ROLLUP
.
NOTA Considere el total anual como Total mensual...
Consulta 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 |
EDITAR
Ok, obtuve tu problema en tus consultas actualizadas. Ambos casos de la declaración If deben devolver el mismo tipo de datos de resultado, por lo que cuando intenta volver a convertir los valores de fecha en numéricos, su caso verdadero devuelve varchar
campo de tipo de datos que es TOTAL
y el campo else devuelve un numeric
tipo de campo por lo que esto provoca el error.
Para resolverlo, debe eliminar la declaración del caso, luego funcionará correctamente según su necesidad.
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 |
Así que ahora tienes que soportar los valores nulos en las columnas de fecha. Espero que esto responda a tus dudas.
Espero que esto ayude......