CTE后的SQL动态透视

CTE后的SQL动态透视,sql,sql-server,dynamic,pivot,Sql,Sql Server,Dynamic,Pivot,我希望这是更具体的?对不起,如果我不清楚的话,这是新的。谢谢你的帮助 我正试图在CTE上获得一个动态支点。我环顾了一下四周,发现了几个问题。对于我来说,下面的文章似乎是动态sql的标准: 我的交易表中有以下列: 日期|产品|时间|价格|数量| 我想得到一天中每个季度的平均价格,所以我想在将时间列四舍五入到最接近的季度时间后,将时间列作为轴心。取每个产品和日期的加权平均价格 因此,我使用一个CTE创建透视列表: DECLARE @pivot_list as varchar(max) ;with

我希望这是更具体的?对不起,如果我不清楚的话,这是新的。谢谢你的帮助

我正试图在CTE上获得一个动态支点。我环顾了一下四周,发现了几个问题。对于我来说,下面的文章似乎是动态sql的标准:

我的交易表中有以下列:

日期|产品|时间|价格|数量|

我想得到一天中每个季度的平均价格,所以我想在将时间列四舍五入到最接近的季度时间后,将时间列作为轴心。取每个产品和日期的加权平均价格

因此,我使用一个CTE创建透视列表:

DECLARE @pivot_list as varchar(max)

;with startquarter(starttradequarter)
AS
(
SELECT  cast(DATEadd(mi,(datediff(mi,0,Time))/15*15,0)as varchar)
    from [table]
where date > '2014-04-15'
),
PIVOT_CODES(PIVOT_CODE)
AS
(
SELECT DISTINCT starttradequarter AS PIVOT_CODE
                from startquarter
)
SELECT @pivot_list = COALESCE(@pivot_list + ',[' + PIVOT_CODE + ']','[' + PIVOT_CODE + ']')
FROM PIVOT_CODES
然后我想在表的轴中使用这个变量:

;With productselector(Date,startquarter,product,volume,price)
as
(
SELECT [Date]
      ,cast(DATEadd(mi,(datediff(mi,0,Time))/15*15,0)as varchar) as startquarter
      ,[product]
      ,[Volume]
      ,[Price]
FROM [table]
where DelDate = '2014-01-06' and product = 'x'
),
WAPricequarter(startquarter,date,sumvolume,WAPq,product)
AS
(
SELECT startquarter 
      ,Date
      ,sum(volume) as sumvolume
      ,round(sum(volume*price)/sum(volume),2) as WAPq
      ,product
      from productselector
      group by date, startquarter, product
)
SELECT date, product, + @pivot_list
from WAPricequarter
PIVOT (
    SUM([sumvolume])
    FOR startquarter IN (@pivot_list)
) AS pvt
所以我看到在所有的动态数据透视中,第二条语句首先放入一个变量,然后执行,这是必要的吗

如果我不知道如何让pivot在@pivot_列表中的列上工作,那么它现在给出了一个我无法工作的错误语法错误


如果必须将其放入变量中然后执行,那么我如何在该变量中仍然筛选产品或日期,因为我必须在其周围使用“”。

需要该变量,因为如果您想要动态轴心,然后您需要动态SQL,以便充分理解动态数据透视和CTE的原因,最好记住范围的概念以及动态SQL的真正含义。CTE的范围相当广泛。动态SQL实际上是唯一动态的,这意味着您正在构建一个要执行的查询字符串。如果从动态sql执行的查询不能访问它试图查询的对象的范围,它将失败