Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将CTE与动态查询透视一起使用?_Sql_Sql Server 2008_Pivot_Common Table Expression_Dynamicquery - Fatal编程技术网

Sql 如何将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。 我真的需要你的帮助 我想要的结果集是这样的。。。 这是我的

我正在使用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);