Опитайте тази заявка
Извлякох част от годината и месеца от датата, така че групирането се извършва за всеки месец от определена година.
изберете shipping_company, SUBSTRING(ship_date, 1, 6), shipping_category, sum(convert(decimal(10,2),shipping_cost))от tblgroup по shipping_company, SUBSTRING(ship_date, 1, 6), shipping_categoryкод>
SQL FIDDLE :
<предварителен код>| SHIPPING_COMPANY | КОЛОНА_1 | КАТЕГОРИЯ_ДОСТАВКА | КОЛОНА_3 |------------------------------------------------ --------------| DHL | 201201 | CD-та | 6.5 || DHL | 201202 | CD-та | 5.5 || DHL | 201203 | CD-та | 46,5 || DHL | 201205 | CD-та | 3.5 || DHL | 201303 | CD-та | 3.5 || DHL | 201304 | CD-та | 8 || DHL | 201305 | CD-та | 4.5 || UPS | 201203 | CD-та | 5.5 || UPS | 201203 | Записи | 4.5 || UPS | 201203 | Ленти | 3.5 || UPS | 201303 | CD-та | 18 || UPS | 201303 | Записи | 4.5 || UPS | 201303 | Ленти | 12.44 || USPS | 201203 | CD-та | 68 || USPS | 201302 | CD-та | 36,5 || USPS | 201303 | CD-та | 37 |
Ако искате обща сума за година, можете да използвате WITH ROLLUP
.
ЗАБЕЛЕЖКА Считайте годишната сума за месечна сума...
Заявка 1 :
изберете 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))от tblgroup от shipping_company , SUBSTRING(дата_на_доставка, 1, 6), категория_доставка СЪС сборен пакет
SQL FIDDLE :
<предварителен код>| SHIPPING_COMPANY | ДАТА | КАТЕГОРИЯ_ДОСТАВКА | КОЛОНА_3 |------------------------------------------------ ------------| DHL | 201201 | CD-та | 6.5 || DHL | 201201 | Годишно ОБЩО | 6.5 || DHL | 201202 | CD-та | 5.5 || DHL | 201202 | Годишно ОБЩО | 5.5 || DHL | 201203 | CD-та | 46,5 || DHL | 201203 | Годишно ОБЩО | 46,5 || DHL | 201205 | CD-та | 3.5 || DHL | 201205 | Годишно ОБЩО | 3.5 || DHL | 201303 | CD-та | 3.5 || DHL | 201303 | Годишно ОБЩО | 3.5 || DHL | 201304 | CD-та | 8 || DHL | 201304 | Годишно ОБЩО | 8 || DHL | 201305 | CD-та | 4.5 || DHL | 201305 | Годишно ОБЩО | 4.5 || DHL | ОБЩО | Годишно ОБЩО | 78 || UPS | 201203 | CD-та | 5.5 || UPS | 201203 | Записи | 4.5 || UPS | 201203 | Ленти | 3.5 || UPS | 201203 | Годишно ОБЩО | 13.5 || UPS | 201303 | CD-та | 18 || UPS | 201303 | Записи | 4.5 || UPS | 201303 | Ленти | 12.44 || UPS | 201303 | Годишно ОБЩО | 34,94 || UPS | ОБЩО | Годишно ОБЩО | 48,44 || USPS | 201203 | CD-та | 68 || USPS | 201203 | Годишно ОБЩО | 68 || USPS | 201302 | CD-та | 36,5 || USPS | 201302 | Годишно ОБЩО | 36,5 || USPS | 201303 | CD-та | 37 || USPS | 201303 | Годишно ОБЩО | 37 || USPS | ОБЩО | Годишно ОБЩО | 141,5 || ОБЩО | ОБЩО | Годишно ОБЩО | 267.94 |РЕДАКТИРАНЕ
Добре, разбрах проблема ви в актуализираните ви заявки. И двата случая на израза If трябва да връщат един и същ тип данни на резултата, така че когато се опитвате да върнете стойностите на датата обратно към числови, вашият истински случай връща varchar
поле за тип данни, което е TOTAL
а полето else връща числово
тип, така че това причинява грешката.
За да го разрешите, трябва да премахнете оператора case, след което той ще работи правилно според вашите нужди.
изберете 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 tblgroup by shipping_company, (CONVERT(numeric, SUBSTRING(ship_date, 1, 6))) , shipping_category С сборен пакет
SQL FIDDLE :
<предварителен код>| SHIPPING_COMPANY | ДАТА | КАТЕГОРИЯ_ДОСТАВКА | КОЛОНА_3 |------------------------------------------------ ------------| DHL | 201201 | CD-та | 6.5 || DHL | 201201 | Годишно ОБЩО | 6.5 || DHL | 201202 | CD-та | 5.5 || DHL | 201202 | Годишно ОБЩО | 5.5 || DHL | 201203 | CD-та | 46,5 || DHL | 201203 | Годишно ОБЩО | 46,5 || DHL | 201205 | CD-та | 3.5 || DHL | 201205 | Годишно ОБЩО | 3.5 || DHL | 201303 | CD-та | 3.5 || DHL | 201303 | Годишно ОБЩО | 3.5 || DHL | 201304 | CD-та | 8 || DHL | 201304 | Годишно ОБЩО | 8 || DHL | 201305 | CD-та | 4.5 || DHL | 201305 | Годишно ОБЩО | 4.5 || DHL | (нула) | Годишно ОБЩО | 78 || UPS | 201203 | CD-та | 5.5 || UPS | 201203 | Записи | 4.5 || UPS | 201203 | Ленти | 3.5 || UPS | 201203 | Годишно ОБЩО | 13.5 || UPS | 201303 | CD-та | 18 || UPS | 201303 | Записи | 4.5 || UPS | 201303 | Ленти | 12.44 || UPS | 201303 | Годишно ОБЩО | 34,94 || UPS | (нула) | Годишно ОБЩО | 48,44 || USPS | 201203 | CD-та | 68 || USPS | 201203 | Годишно ОБЩО | 68 || USPS | 201302 | CD-та | 36,5 || USPS | 201302 | Годишно ОБЩО | 36,5 || USPS | 201303 | CD-та | 37 || USPS | 201303 | Годишно ОБЩО | 37 || USPS | (нула) | Годишно ОБЩО | 141,5 || ОБЩО | (нула) | Годишно ОБЩО | 267.94 |Така че сега трябва да понасяте нулевите стойности в колоните с дати. Надявам се това да отговори на съмненията ви.
Надявам се това да помогне......