Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

TSQL Сума по групи за месечни отчети

Опитайте тази заявка

Извлякох част от годината и месеца от датата, така че групирането се извършва за всеки месец от определена година.

изберете 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 |

Така че сега трябва да понасяте нулевите стойности в колоните с дати. Надявам се това да отговори на съмненията ви.

Надявам се това да помогне......




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Актуализиране на таблица с работен ден и календарен ден

  2. Какво означават тези опции за архивиране само за копиране?

  3. Локален отчет спрямо сървърен отчет в ASP .Net контрол за преглед на отчети

  4. Избройте всички външни ключове в таблица в SQL Server

  5. Какъв вид механизми за криптиране предлага SQL Server 2008 Standard?