如何使用 SQL 中的变量来使用 Pivot?
how can I use Pivot using a variable in SQL?
我有来自 table Paycodes 的 paycode 号码和名字
我在 monthlyTransaction 中有金额。如下:
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
我希望它像这样使用 pivot
Basic Salary Variable Deduction Amount Fixed/Var Insurance PayCode
31000 10000 120000
我想使用 pivot 对每个 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 ('+@data+')
) AS pvt '
EXECUTE Sp_executesql @query
当我打印@data 时,它只检索最后一个支付码!
谁能帮忙?
要获取@data 中的所有支付代码,请使用
SELECT @data = @data + Paycode.PayCodeName + ', '
FROM Paycode
然后去掉最后一个逗号
这应该可以解决问题
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
答案是:
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 ( '+@codeNameCol+' ) ) PivotTable;'
EXEC (@querys)
我有来自 table Paycodes 的 paycode 号码和名字 我在 monthlyTransaction 中有金额。如下:
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
我希望它像这样使用 pivot
Basic Salary Variable Deduction Amount Fixed/Var Insurance PayCode
31000 10000 120000
我想使用 pivot 对每个 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 ('+@data+')
) AS pvt '
EXECUTE Sp_executesql @query
当我打印@data 时,它只检索最后一个支付码! 谁能帮忙?
要获取@data 中的所有支付代码,请使用
SELECT @data = @data + Paycode.PayCodeName + ', '
FROM Paycode
然后去掉最后一个逗号
这应该可以解决问题
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
答案是:
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 ( '+@codeNameCol+' ) ) PivotTable;'
EXEC (@querys)