Dynamic Pivot Table - 如何将生成的列添加到另一个 table?
Dynamic Pivot Table - How to add the columns generated to another table?
我有一个将行转换为列的动态数据透视查询。目前,我将所有数据集中在一个 table 中,但如果两个单独的 table 更容易,则可以将其分开。
我只需要像这样旋转的一些列 ChargeNames(包括相关费用)是否可以只旋转 table 的一部分并将新的 Pivot table 连接到源 table?
或者我可以用所需的数据创建一个新的 table 并旋转它,然后将它连接到另一个 table 吗?
如果听起来有些混乱,我们深表歉意
所有数据的来源table
Pivot table(pivot 列是 Chargenames)
代码 - 声明和填充 table
--Create temporary table
CREATE TABLE ##tempGetPaymentAnalysisByMember
(
MemberID NVARCHAR(MAX),
FirstName NVARCHAR(MAX),
Surname NVARCHAR(MAX),
CategoryName NVARCHAR(MAX),
InvoiceID INT,
ChargeNames NVARCHAR(MAX),
ChargeAmount INT,
TotalAmount INT
)
--Populate the table
INSERT INTO ##tempGetPaymentAnalysisByMember(MemberID, FirstName, Surname, CategoryName, InvoiceID, ChargeNames, ChargeAmount, TotalAmount)
SELECT Member.ID, Member.FirstName, Member.Surname, Category.Name, Invoice.ID, ChargeType.Name, Charge.Amount, Invoice.Amount
FROM dbo.Member, dbo.Category, dbo.Invoice, dbo.ChargeType, dbo.Charge
WHERE Category.ID = Member.CategoryID
AND Member.ID = Invoice.MemberID
AND Charge.ChargeTypeID = ChargeType.ID
AND Charge.InvoiceID = Invoice.ID
--Test select to check if data is correct
SELECT * FROM ##tempGetPaymentAnalysisByMember
枢轴查询
SELECT @ColumnName = ISNULL(@ColumnName + ',','')
+QUOTENAME(ChargeNames)
FROM (SELECT DISTINCT ChargeNames FROM ##tempGetPaymentAnalysisByMember) AS ChargeName
SET @DynamicPivotQuery =
'SELECT ' + @ColumnName +
' FROM ##tempGetPaymentAnalysisByMember
PIVOT(MIN(ChargeAmount)
FOR ChargeNames IN (' + @ColumnName + ')) AS PivotTable'
EXEC sp_executesql @DynamicPivotQuery
非常感谢
我设法让它工作而不需要额外的 table。
我能够将两个 table 连接在一起并在 select 数量的列上执行 PIVOT,这在我之前并不知道您可以做到。
我知道下面的代码需要稍微清理一下以阻止可能的 SQL 注入攻击,但我会保留它直到我让整个程序正常工作。
SELECT @ColumnName = ISNULL(@ColumnName + ',','')
+QUOTENAME(ChargeName)
FROM (SELECT DISTINCT ChargeName FROM ##chargesTable) AS ChargeName
SET @DynamicPivotQuery =
'SELECT MemberID, FirstName, Surname, CategoryName, TotalAmount, ' + @ColumnName +
' FROM ##chargesTable
PIVOT(MIN(ChargeAmount)
FOR ChargeName IN (' + @ColumnName + ')) AS PivotTable
ORDER BY MemberID'
EXEC sp_executesql @DynamicPivotQuery
我有一个将行转换为列的动态数据透视查询。目前,我将所有数据集中在一个 table 中,但如果两个单独的 table 更容易,则可以将其分开。
我只需要像这样旋转的一些列 ChargeNames(包括相关费用)是否可以只旋转 table 的一部分并将新的 Pivot table 连接到源 table?
或者我可以用所需的数据创建一个新的 table 并旋转它,然后将它连接到另一个 table 吗?
如果听起来有些混乱,我们深表歉意
所有数据的来源table
Pivot table(pivot 列是 Chargenames)
代码 - 声明和填充 table
--Create temporary table
CREATE TABLE ##tempGetPaymentAnalysisByMember
(
MemberID NVARCHAR(MAX),
FirstName NVARCHAR(MAX),
Surname NVARCHAR(MAX),
CategoryName NVARCHAR(MAX),
InvoiceID INT,
ChargeNames NVARCHAR(MAX),
ChargeAmount INT,
TotalAmount INT
)
--Populate the table
INSERT INTO ##tempGetPaymentAnalysisByMember(MemberID, FirstName, Surname, CategoryName, InvoiceID, ChargeNames, ChargeAmount, TotalAmount)
SELECT Member.ID, Member.FirstName, Member.Surname, Category.Name, Invoice.ID, ChargeType.Name, Charge.Amount, Invoice.Amount
FROM dbo.Member, dbo.Category, dbo.Invoice, dbo.ChargeType, dbo.Charge
WHERE Category.ID = Member.CategoryID
AND Member.ID = Invoice.MemberID
AND Charge.ChargeTypeID = ChargeType.ID
AND Charge.InvoiceID = Invoice.ID
--Test select to check if data is correct
SELECT * FROM ##tempGetPaymentAnalysisByMember
枢轴查询
SELECT @ColumnName = ISNULL(@ColumnName + ',','')
+QUOTENAME(ChargeNames)
FROM (SELECT DISTINCT ChargeNames FROM ##tempGetPaymentAnalysisByMember) AS ChargeName
SET @DynamicPivotQuery =
'SELECT ' + @ColumnName +
' FROM ##tempGetPaymentAnalysisByMember
PIVOT(MIN(ChargeAmount)
FOR ChargeNames IN (' + @ColumnName + ')) AS PivotTable'
EXEC sp_executesql @DynamicPivotQuery
非常感谢
我设法让它工作而不需要额外的 table。
我能够将两个 table 连接在一起并在 select 数量的列上执行 PIVOT,这在我之前并不知道您可以做到。
我知道下面的代码需要稍微清理一下以阻止可能的 SQL 注入攻击,但我会保留它直到我让整个程序正常工作。
SELECT @ColumnName = ISNULL(@ColumnName + ',','')
+QUOTENAME(ChargeName)
FROM (SELECT DISTINCT ChargeName FROM ##chargesTable) AS ChargeName
SET @DynamicPivotQuery =
'SELECT MemberID, FirstName, Surname, CategoryName, TotalAmount, ' + @ColumnName +
' FROM ##chargesTable
PIVOT(MIN(ChargeAmount)
FOR ChargeName IN (' + @ColumnName + ')) AS PivotTable
ORDER BY MemberID'
EXEC sp_executesql @DynamicPivotQuery