2016-08-03 2 views
0

У меня есть номера и имена кодов оплаты из таблицы Paycodes , и у меня есть сумма в ежемесячномTransaction. следующим образом:Как я могу использовать Pivot, используя переменную в SQL?

Paycodes 
Code  Name 
1  Basic Salary 
2  Variable Deduction Amount 
3  Fixed/Var Insurance PayCode 

MonthlyTransaction 
Code  Amount 
1  3000 
2  10000 
1  130000 
1  150000 
3  120000 

Я хочу, чтобы это было как это с помощью шарнира

Basic Salary Variable Deduction Amount Fixed/Var Insurance PayCode 
31000   10000      120000 

Я хочу использовать стержень просуммировать количество каждого Paycode, и я использовал это: -

DECLARE @data AS NVARCHAR(MAX) 
DECLARE @query AS NVARCHAR(MAX) 


-- DECLARE @data TABLE 
--(
-- PaycodeName NVARCHAR(max) 
--) 
--INSERT INTO @data 
--  (PaycodeName) 
--select dbo.Paycode.PayCodeName FROM dbo.Paycode 




select @data = Paycode.PayCodeName FROM Paycode 


set @query = 'SELECT * FROM (
    SELECT Paycode.Name , MonthlyTransaction.Amount 
    From MonthlyTransaction 
    LEFT JOIN dbo.Paycode ON Paycode.code = MonthlyTransaction.Paycode 
    ) AS s 
    PIVOT 
    (
     SUM(Amount) 
     FOR Paycode.Name IN ('[email protected]+') 
    ) AS pvt ' 

EXECUTE Sp_executesql @query 

Когда я печатаю @data, он получает только последний код оплаты! Может ли кто-нибудь помочь?

+0

Возможный дубликат [SQL Server dynamic PIVOT q uery?] (http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) –

+0

Что делает опорная точка для выбора @data? – Jonny

+0

@jonny ... он должен получить все имена кодов оплаты! –

ответ

0

ответ:

DECLARE @codeNameCol NVARCHAR(max) 

SELECT @codeNameCol= COALESCE(@codeNameCol + ',','') + QUOTENAME(RTRIM(LTRIM(PayCodeName))) 
FROM (SELECT DISTINCT PayCodeName FROM Paycode) AS codeNameCol 

DECLARE @querys NVARCHAR(max) 

Set @querys=' 
SELECT * 
FROM (SELECT dbo.EmpAssignment.EmployeeId , 
       PayCodeName , 
       Amount 
     FROM  dbo.MonthlyTransaction 
       LEFT JOIN dbo.Paycode ON Paycode.code = MonthlyTransaction.Paycode 
       LEFT JOIN dbo.EmpAssignment ON EmpAssignment.EmpId = MonthlyTransaction.EmpId 
       LEFT JOIN dbo.PayrollGroup ON PayrollGroup.PayrollGroup = EmpAssignment.PayrollGroup 
    ) DataTable PIVOT 
(SUM(Amount) FOR PayCodeName IN ('[email protected]+')) PivotTable;' 

EXEC (@querys) 
1

Чтобы получить все paycodes в @data использования

SELECT @data = @data + Paycode.PayCodeName + ', ' 
FROM Paycode 

Затем удалить последнюю запятую

+0

(Y) это сработало ... но результата не получилось .. у вас есть идея, почему запрос не получил результирующие множества ??! –

0

Это должно сделать трюк

SELECT 1 Code, 'Basic Salary' Name 
INTO #Paycode 
UNION 
SELECT 2 Code, 'Variable Deduction Amount' Name 
UNION 
SELECT 3 Code, 'Fixed/Var Insurance PayCode' Name 

SELECT 1 Code, 3000 Amount 
INTO #MonthTrans 
UNION 
SELECT 2 Code, 10000 Amount 
UNION 
SELECT 1 Code, 130000 Amount 
UNION 
SELECT 1 Code, 150000 Amount 
UNION 
SELECT 3 Code, 120000 Amount 

DECLARE @data AS NVARCHAR(MAX) 

SELECT @data = ISNULL(@data,'') + '[' +CAST(Code AS varchar) + '], ' 
FROM #Paycode 

SELECT @data=SUBSTRING(@data, 0, LEN(@data)) 


DECLARE @query AS NVARCHAR(MAX) 

SELECT @query = 'SELECT * 
FROM 
    #MonthTrans M 
PIVOT ( 
    SUM(Amount) FOR Code IN (' + @data + ') 
) pvt' 


EXECUTE Sp_executesql @query 


drop table #paycode 
drop table #MonthTrans 
+0

Недопустимое имя объекта '#Paycodes'. ! –

+0

Я использовал соблазны, чтобы попробовать. Замените имена на свои таблицы – Jonny

+0

проверьте мой ответ ... Спасибо 4 help :) –

Смежные вопросы