【发布时间】:2019-11-07 13:53:59
【问题描述】:
我有一个使用数据透视函数的动态查询,以下是我的表中的数据示例。
Status 1 | Week 1 |25
Status 1 | Week 1 |25
Status 1 | Week 2 |25
Status 2 | Week 1 | 2
Status 2 | Week 1 | 8
Status 2 | Week 1 | 10
Status 2 | Week 1 | 10
这是一个如何返回数据的示例。
Week 1 Week 2
Status 1 | 50 25
Status 2 10 20
对于我的查询,我将在一周内通过,并且我想在接下来的 5 周内进行调整,例如,如果我通过 1,我希望有从第 1 周到第 6 周的列。 为了方便起见,我编写了以下查询。
--EXEC usp_weekReport @weeks=1, @year='2019'
ALTER PROC usp_weekReport
(
@weeks INT,
@year NVARCHAR(4)
)
AS
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX), @csql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME([week])
FROM (
SELECT p.[week]
FROM [Housing_support_DB].[dbo].[Invoices] P
WHERE DATEPART(YEAR,P.date)='2019'--@year
AND
([week] IN (1)
OR
[week] IN (1+1)
OR
[week] IN (1+2)
OR
[week] IN (1+3)
OR
[week] IN (1+4)
OR
[week] IN (1+5)
)
GROUP BY P.[week]
) AS x;
SET @sql = N'
SELECT p.[statusName],' + STUFF(@columns, 1, 2, '') + '
FROM
(
SELECT
SUM(CAST(REPLACE(REPLACE(A.amount,'','',''''),''$'','''') AS FLOAT)) as sumInvoice,
A.invoiceStatusID_FK,
B.statusName,
-- C.programme,
[week]
FROM [dbo].[Invoices] A
INNER JOIN invoiceStatus B
ON A.invoiceStatusID_FK=B.invoiceStatusID
-- INNER JOIN CapitalAccountBalances C
-- ON C.accountBalanceID=A.accountBalanceID_FK
-- WHERE A.accountBalanceID_FK=5
GROUP BY invoiceStatusID_FK,B.statusName,[week]--,C.programme
) AS j
PIVOT
(
SUM(sumInvoice) FOR [week] IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
+ ')
) AS p;';
--PRINT @sql;
EXEC sp_executesql @sql;
--SET @csql = N'
--CREATE TABLE ##reportResult
--(
--statusName nvarchar(50),'+
CREATE TABLE ##reportResult
(
statusName nvarchar(50),
weekA INT DEFAULT 0,
weekB int DEFAULT 0--,
--weekC int DEFAULT 0,
--weekD int DEFAULT 0,
--weekE int DEFAULT 0,
--weekF int DEFAULT 0
)
INSERT into ##reportResult Exec(@sql)
--INSERT ##reportResult Exec(@sql)
--SELECT statusName, weekA,weekB,weekC,weekD,weekE,weekF -- here you have "static SELECT with field names"
--FROM ##reportResult
--DROP TABLE ##reportResult
问题
我在这里遇到的一个大问题是,我需要将此查询的结果发送到 tempTable...#reportResult。因此,我需要创建表。但是,如果我尝试使用预期的最大列数 (6) 创建表,我将收到无效的列数错误。例如,在我的数据库中我只有两个星期,这就是为什么我只能创建包含 weekA 和 weekB 列的表。我也无法选择进入。
目前,我正在尝试找到一种方法来根据数据透视表第一部分的周数动态创建表。或者,为了在运行时操作数据透视表的第一部分以选择周、周+1 等作为列,我可以创建包含所有字段的列。
感谢您提供的任何帮助。
【问题讨论】:
标签: sql tsql sql-server-2008-r2