2016-08-03 26 views
0

我有付款代码号码和表Paycodes 名称,我有金额在monthlyTransaction。如下:如何在SQL中使用Pivot变量?

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动态PIVOT q的可能重复uery?](http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) –

+0

这个关键点与select @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

我用temptables来试用它。将名称替换到您的表 – Jonny

+0

检查我的答案...谢谢4帮助:) –