Бих направил това малко по-различно, като приложим и двата 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 |