SQL Server : динамический свод по многим столбцам

#sql #sql-server #dynamic #pivot

Вопрос:

У меня есть стол, который выглядит так:

 DECLARE @Temp TABLE (  fldID bigint ,fldYear bigint ,fldMonth bigint ,fldMonthName nvarchar(350) ,fldPayrollId bigint ,fldFullName nvarchar(350) ,fldDailyWage float ,fldMonthlyWage float ,fldkarkardDay float ,fldPriceMaskan float ,fldPriceChild float ,fldPriceFood float ,fldAllAdditions float ,fldPriceTax float ,fldPriceSanavat float ,fldPriceEzafeKari float ,fldPriceEidiPadash float ,fldEmployeeShare float ,fldEmployerShare float ,fldUnemploymentShare float ,fldSumEmployer float);  

вот так

 insert @Temp(fldID, fldYear, fldMonth, fldMonthName, fldPayrollId, fldFullName, fldDailyWage, fldMonthlyWage , fldkarkardDay , fldPriceMaskan , fldPriceChild, fldPriceFood , fldAllAdditions , fldPriceTax ,  fldPriceSanavat, fldPriceEzafeKari , fldPriceEidiPadash , fldEmployeeShare , fldEmployerShare , fldUnemploymentShare , fldSumEmployer ) values(1, 1400, 2, N'February', 212, N'500000', N'6500', N'29', N'52000', N'98750', N'1900000', N'900000', N'30000', N'900000', N'60000', N'650000', N'0', N'0', N'1900000', N'256000', N'256000'),(2, 1399, 3, N'March' , 214, N'5200000', N'0', N'30', N'65900', N'6520', N'1900000', N'1000', N'98500', N'1900000', N'1900000', N'1900000', N'0', N'1900000', N'0', N'256000', N'0'),(3, 1400, 4, N'April' , 216, N'62200000', N'35600', N'30', N'87900', N'65000', N'0', N'6520', N'1900000', N'1900000', N'0', N'1900000', N'1900000', N'1900000', N'1900000', N'256000', N'25600'),(4, 1399, 5, N'May' , 218, N'522000', N'85000', N'2800', N'65400', N'52200', N'0', N'14780', N'1900000', N'1900000', N'0', N'1900000', N'0', N'1900000', N'1900000', N'256000', N'0')  

Я пытаюсь повернуть его следующим образом:

введите описание изображения здесь

Мой код выглядит следующим образом, но команда pivot не может определить код и правильный вывод

 SELECT   N'parameter' parameter  ,p.fldMonthName   ,p.fldCols FROM  (  SELECT   N'[fldDailyWage],[fldMonthlyWage],[fldkarkardDay],[fldPriceMaskan],[fldPriceChild],[fldPriceFood],[fldAllAdditions],[fldPriceTax]' fldCols  ,*   FROM @Temp where fldYear = 1399 ) x PIVOT  (  count(fldID)  FOR fldMonthName IN (fldCols) ) p  

Комментарии:

1. Это непривязка, а не стержень.

2. Обратите внимание, что хранение денежных ценностей в a float ужасная идея. Используйте базовый 10 числовой тип данных. Если только вы намеренно не хотите, чтобы кто-то, кто заплатил 200.20 налог, сохранял свою налоговую стоимость как 200.1999969482421875 (что приведет к всевозможным ошибкам округления в будущем).

3. Это НЕПРИВИВКА, за которой следует ПОВОРОТ месяца. Вам действительно нужно делать это в TSQL? Поворот и отключение для отображения лучше выполнять в интерфейсе.

Ответ №1:

Я бы использовал unpivot с параметром группировки по столбцам следующим образом:

 Select u.parameter, Sum(Case When fldMonth=2 Then u.value End) As 'February',  Sum(Case When fldMonth=5 Then u.value End) As 'May' From ( select fldMonth, [fldDailyWage],[fldMonthlyWage],[fldkarkardDay],[fldPriceMaskan],[fldPriceChild],[fldPriceFood],[fldAllAdditions],[fldPriceTax] from @Temp) t unpivot (   value  for parameter in ([fldDailyWage],[fldMonthlyWage],[fldkarkardDay],[fldPriceMaskan],[fldPriceChild],[fldPriceFood],[fldAllAdditions],[fldPriceTax]) ) u Group by u.parameter