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

Обобщена таблица на SQL Server с множество агрегати на колони

Бих направил това малко по-различно, като приложим и двата UNPIVOT и PIVOT функции, за да получите крайния резултат. Отвъртане взема стойностите и от totalcount и totalamount колони и ги поставя в една колона с множество редове. След това можете да завъртите тези резултати.:

изберете chardate, Australia_totalcount като [Australia # of Transactions], Australia_totalamount като [Australia Total $ Amount], Austria_totalcount като [Austria # of Transactions], Austria_totalamount като [Austria Total $ Amount]from( char da numericmonth, , държава +'_'+col col, стойност от ( изберете числов месец, държава, chardate, cast(totalcount като число(10, 2)) totalcount, cast(totalamount като число(10, 2)) обща сума от моите транзакции ) src unpivot ( стойност за col в (totalcount, totalamount) ) unpiv) spivot( sum(value) for col in (Australia_totalcount, Australia_totalamount, Austria_totalcount, Austria_totalamount)) pivorder по числови месеци 

Вижте SQL Fiddle с демонстрация.

Ако имате неизвестен номер country имена, тогава можете да използвате динамичен SQL:

ДЕКЛАРИРАЙТЕ @cols КАТО NVARCHAR(MAX), @colsName КАТО NVARCHAR(MAX), @query КАТО NVARCHAR(MAX)изберете @cols =STUFF((ИЗБЕРЕТЕ различен ',' + QUOTENAME(държава +'_') +c.col) от моите транзакции се прилага кръстосано ( изберете 'TotalCount' col union all изберете 'TotalAmount' ) c ЗА XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1, 1,'')изберете @colsName =STUFF((ИЗБЕРЕТЕ различен ', ' + QUOTENAME(country +'_'+c.col) +' като [' + държава + случай, когато c.col ='TotalCount', след това ' # of Transactions]' else 'Total $ Amount]' края от моите транзакции кръстосано се прилага ( изберете 'TotalCount' col union всички изберете 'TotalAmount' ) c ЗА XML PATH(''), TYPE ).value('.', 'NVARCHAR( MAX)') ,1,1,'')set @query ='ИЗБЕРЕТЕ chardate, ' + @colsName + ' от ( изберете числов месец, chardate, държава +''_''+col col, стойност от ( изберете числов месец, държава, chardate, cast(totalcount като число(10, 2)) totalcount, cast(totalamount като число(10, 2)) totalamount от моите транзакции) src unpivot (стойност за col в (totalcount, totalamount) ) unpiv ) s pivot ( сума(стойност) за col in (' + @cols + ') ) p подреждане по numericmonth'execute(@query) 

Вижте SQL Fiddle с демонстрация

И двете дават резултат:

<предварителен код>| CHARDATE | АВСТРАЛИЯ БРОЙ НА ТРАНЗАКЦИИ | АВСТРАЛИЯ ОБЩО $ СУМА | АВСТРИЯ БРОЯ НА ТРАНЗАКЦИИ | АВСТРИЯ ОБЩА СУМА $ |----------------------------------------------------- -------------------------------------------------- ----------------------------------------| юли-12 | 36 | 699,96 | 11 | 257,82 || 12 август | 44 | 1368,71 | 5 | 126,55 || 12 септември | 52 | 1161.33 | 7 | 92.11 || 12 октомври | 50 | 1099,84 | 12 | 103,56 || 12 ноември | 38 | 1078,94 | 21 | 377,68 || 12 декември | 63 | 1668,23 | 3 | 14.35 |

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Безплатни методи за поправяне на повреда в индекса на SQL Server

  2. Конфигуриране на AlwaysOn Availability Groups на SQL Server

  3. Какъв размер използвате за varchar(MAX) във вашата декларация за параметри?

  4. Разлика между подзаявка и корелирана подзаявка

  5. как да декларирам глобална променлива в SQL Server ..?