#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