Sql 如何将CTE与动态查询透视一起使用?
我正在使用SQLServer2008R2 首先,我需要将表1中的开始日期和结束日期分解为每天,这是我使用递归CTE所做的。 现在,每当我将这两件事结合在一起时,我就会陷入困境,有时结果集不是我想要的,有时错误为“无效列名”或“多部分标识符无法绑定” 注 表1和表2是不同的表,它们没有像key或id这样的共同点 我尝试过很多事情,比如联合或不同的方法,但都不能解决我的问题。 对不起,如果我不是更具体,但我是新的这个支点,东西,和CTE。 我真的需要你的帮助 我想要的结果集是这样的。。。 这是我的尝试Sql 如何将CTE与动态查询透视一起使用?,sql,sql-server-2008,pivot,common-table-expression,dynamicquery,Sql,Sql Server 2008,Pivot,Common Table Expression,Dynamicquery,我正在使用SQLServer2008R2 首先,我需要将表1中的开始日期和结束日期分解为每天,这是我使用递归CTE所做的。 现在,每当我将这两件事结合在一起时,我就会陷入困境,有时结果集不是我想要的,有时错误为“无效列名”或“多部分标识符无法绑定” 注 表1和表2是不同的表,它们没有像key或id这样的共同点 我尝试过很多事情,比如联合或不同的方法,但都不能解决我的问题。 对不起,如果我不是更具体,但我是新的这个支点,东西,和CTE。 我真的需要你的帮助 我想要的结果集是这样的。。。 这是我的
DECLARE @TimeBandColms AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @TimeBandColms = STUFF((SELECT ',' + QUOTENAME(t.TimeBandName)
from table2 t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
set @query = 'DECLARE @maxdate DATETIME = (SELECT Max([EndDate]) FROM
table1);
WITH CTE_DateToDays
AS (SELECT StartDate as Dates
FROM table1
UNION ALL
SELECT Dateadd(day, 1, Dates)
FROM CTE_DateToDays
WHERE Dates < @maxdate)'
Set @query += N'SELECT ' + @TimeBandColms + N' from
(
SELECT CTE_DateToDays.Dates, t.TimeBandID,t.TimeBandName
FROM CTE_DateToDays,
table2 t
) x
pivot
(
max(Dates)
for TimeBandName in (' + @TimeBandColms + N')
) piv;'
exec (@query);
你可以试试这个
DECLARE @TimeBandColms AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @TimeBandColms = STUFF((SELECT ',' + QUOTENAME(t.TimeBandName)
from table2 t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
set @query = 'DECLARE @maxdate DATETIME = (SELECT Max([EndDate]) FROM
table1);
WITH CTE_DateToDays
AS (SELECT StartDate as Dates
FROM table1
UNION ALL
SELECT Dateadd(day, 1, Dates)
FROM CTE_DateToDays
WHERE Dates < @maxdate)'
Set @query += N'SELECT Dates, ' + @TimeBandColms + N' from
(
SELECT CTE_DateToDays.Dates, t.TimeBandID, t.TimeBandName
FROM CTE_DateToDays
CROSS JOIN table2 t
) x
pivot
(
count(TimeBandID)
for TimeBandName in (' + @TimeBandColms + N')
) piv;'
exec (@query);
请向我们显示您的尝试显示了我的尝试,编辑了我的问题详细信息。我很早就尝试了此操作,但是如果在“+@TimeBandColms+N”piv;中更改了pivot pivot countTimeBandID for TimeBandName,则返回ID计数或ID最大数量的行将被删除尽管结果在微小的修改中发生了变化,但仍然停留在那个里。当我使用查询字符串和不使用查询字符串时,您知道为什么结果不同吗?即使sql查询是相同的。
DECLARE @TimeBandColms AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @TimeBandColms = STUFF((SELECT ',' + QUOTENAME(t.TimeBandName)
from table2 t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
set @query = 'DECLARE @maxdate DATETIME = (SELECT Max([EndDate]) FROM
table1);
WITH CTE_DateToDays
AS (SELECT StartDate as Dates
FROM table1
UNION ALL
SELECT Dateadd(day, 1, Dates)
FROM CTE_DateToDays
WHERE Dates < @maxdate)'
Set @query += N'SELECT ' + @TimeBandColms + N' from
(
SELECT CTE_DateToDays.Dates, t.TimeBandID,t.TimeBandName
FROM CTE_DateToDays,
table2 t
) x
pivot
(
max(Dates)
for TimeBandName in (' + @TimeBandColms + N')
) piv;'
exec (@query);
DECLARE @TimeBandColms AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @TimeBandColms = STUFF((SELECT ',' + QUOTENAME(t.TimeBandName)
from table2 t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
set @query = 'DECLARE @maxdate DATETIME = (SELECT Max([EndDate]) FROM
table1);
WITH CTE_DateToDays
AS (SELECT StartDate as Dates
FROM table1
UNION ALL
SELECT Dateadd(day, 1, Dates)
FROM CTE_DateToDays
WHERE Dates < @maxdate)'
Set @query += N'SELECT Dates, ' + @TimeBandColms + N' from
(
SELECT CTE_DateToDays.Dates, t.TimeBandID, t.TimeBandName
FROM CTE_DateToDays
CROSS JOIN table2 t
) x
pivot
(
count(TimeBandID)
for TimeBandName in (' + @TimeBandColms + N')
) piv;'
exec (@query);