SQL-使用CTE将案例语句结果传递到后续公式/案例语句

发布于 2025-02-05 20:40:13 字数 3685 浏览 2 评论 0原文

我试图使用CTE将案例语句作为输入的结果传递到随后的案例语句,直到汇总到每日值之前。以下代码的目的是:

  1. 第一个查询所有相关字段从相关表(Poidata,Interterdata和WeatherSerstationData)加入和分组的COMOON TIMESTAMP_UTC列加入和分组的
  2. 所有相关字段中。 [mon],[day],[sum_meter_kwh],[sum_expected_kwh],[cortailed_energy_kwh]和[inv_count])
  3. 查询从cte_1到cte_2到cte_2中的所有字段,并使用cte_1([Inv_count],[sum_meter_kwh],[[sum_meter_kwh],[[sum_meter_kwh],[sum_meter_kwh],[sum_meth],[sum_meter_kwh],[sum_meter_kwh],[sum_meter_kwh],[sum_meter_kwh],[ sum_expected_kwh]和[cortailed_energy_kwh])要计算CTE_2中的新字段([availability_invtime(%)]和[EnergeCIC_Avail(%)])和汇总/组分钟级别的数据到年度,每月,每月,
  4. 按CTE_2的所有字段,以及从CTE_2和CTE_2进行订单。年份,月份,日期

为6/7/2022 11:33 AM CST* '''

WITH
    CTE_1 AS
        (SELECT        
                POIData.Timestamp_UTC as [TimeDate],
                SUM(POIData.Meter_KW/60) as [Sum_Meter_KWh],
                SUM(POIData.Park_Potential_KW/60) as [Sum_Expected_KWh],
                SUM(CASE
                        WHEN (POIData.Park_Potential_KW > POIData.Meter_KW)
                            AND POIData.Meter_KW>=0
                            AND POIData.Park_Potential_KW>=0      
                            AND (WeatherStationData.Valid = 1)
                            AND (POIData.Valid = 1)
                            AND (WeatherStationData.GPOA_1 > 50)
                            AND (POIData.Power_Limit_SP < 120000)
                            AND (POIData.Park_Potential_KW > POIData.Power_Limit_SP)
                        THEN (POIData.Park_Potential_KW/60) - (POIData.Meter_KW/60)
                        WHEN (POIData.Park_Potential_KW <= POIData.Meter_KW) OR POIData.Park_Potential_KW<0
                        THEN 0
                        END 
                ) AS [Curtailed_Energy_KWh],
                
                COUNT(CASE
                        WHEN InverterData.Valid = 1
                            AND InverterData.Active_Power > 0
                            AND  WeatherStationData.GPOA_1 > 100
                        THEN InverterData.fkInverterID
                        END
                ) AS [Inv_Count]
                


        FROM        [Comanche].[dbo].POIData INNER JOIN
                    [Comanche].[dbo].InverterData ON POIData.Timestamp_UTC = InverterData.Timestamp_UTC INNER JOIN
                    [Comanche].[dbo].WeatherStationData ON POIData.Timestamp_UTC = WeatherStationData.Timestamp_UTC

        WHERE       DATEADD(HOUR,-6,POIData.Timestamp_UTC) >= '2022-05-01' and DATEADD(HOUR,-6,POIData.Timestamp_UTC) < '2022-06-01'
        GROUP BY    POIData.Timestamp_UTC
    ),
    
    CTE_2 AS
    (
        SELECT  *,
                datepart(YY,DATEADD(HOUR,-6,[TimeDate])) as [Year],
                datepart(MM,DATEADD(HOUR,-6,[TimeDate])) as [Mon],
                datepart(DD,DATEADD(HOUR,-6,[TimeDate])) as [Day],
                AVG(CASE
                        WHEN [Inv_Count]<300
                        THEN [Inv_Count]/300
                        ELSE 1
                    END) AS 'Availability_InvTime(%)',

                (SUM([Sum_Meter_KWh]) + SUM([Curtailed_Energy_KWh]))/SUM([Sum_Expected_KWh]) as 'Energetic_Avail(%)'

        FROM CTE_1
        GROUP BY    
                    datepart(YY,DATEADD(HOUR,-6,[TimeDate])),
                    datepart(MM,DATEADD(HOUR,-6,[TimeDate])),
                    datepart(DD,DATEADD(HOUR,-6,[TimeDate]))
    )


SELECT * FROM CTE_2
                
ORDER BY    --POIData.Timestamp_UTC,
            [Year], [Mon], [Day]

'''

上面的代码会导致以下错误:

msg 8120,级别16,状态1,第1行 列“ cte_1.timedate”在选择列表中无效,因为它不包含在聚合函数中或子句中的组中。

有什么建议吗?谢谢你!

I'm trying to use CTEs to pass results from CASE statements as inputs to subsequent CASE statements on minute-level date before aggregating to daily values. The intention of the code below is to:

  1. First query all of the relevant fields into CTE_1 from the relevant tables (POIData, InverterData, and WeatherStationData) joining and grouping by the common Timestamp_UTC column
  2. Create several new fields in CTE_1 ([Year], [Mon], [Day], [Sum_Meter_KWh], [Sum_Expected_KWh], [Curtailed_Energy_KWh], and [Inv_Count])
  3. Query all of the fields from CTE_1 into CTE_2 and use the fields created in CTE_1 ([Inv_Count], [Sum_Meter_KWh], [Sum_Expected_KWh] and [Curtailed_Energy_KWh]) to calculate new fields in CTE_2 ([Availability_InvTime(%)] and [Energetic_Avail(%)]) and aggregate/group minute-level data into Year, Month, Day
  4. Query all fields from CTE_2 and order by Year, Month, Day

EDITED 6/7/2022 11:33AM CST*
'''

WITH
    CTE_1 AS
        (SELECT        
                POIData.Timestamp_UTC as [TimeDate],
                SUM(POIData.Meter_KW/60) as [Sum_Meter_KWh],
                SUM(POIData.Park_Potential_KW/60) as [Sum_Expected_KWh],
                SUM(CASE
                        WHEN (POIData.Park_Potential_KW > POIData.Meter_KW)
                            AND POIData.Meter_KW>=0
                            AND POIData.Park_Potential_KW>=0      
                            AND (WeatherStationData.Valid = 1)
                            AND (POIData.Valid = 1)
                            AND (WeatherStationData.GPOA_1 > 50)
                            AND (POIData.Power_Limit_SP < 120000)
                            AND (POIData.Park_Potential_KW > POIData.Power_Limit_SP)
                        THEN (POIData.Park_Potential_KW/60) - (POIData.Meter_KW/60)
                        WHEN (POIData.Park_Potential_KW <= POIData.Meter_KW) OR POIData.Park_Potential_KW<0
                        THEN 0
                        END 
                ) AS [Curtailed_Energy_KWh],
                
                COUNT(CASE
                        WHEN InverterData.Valid = 1
                            AND InverterData.Active_Power > 0
                            AND  WeatherStationData.GPOA_1 > 100
                        THEN InverterData.fkInverterID
                        END
                ) AS [Inv_Count]
                


        FROM        [Comanche].[dbo].POIData INNER JOIN
                    [Comanche].[dbo].InverterData ON POIData.Timestamp_UTC = InverterData.Timestamp_UTC INNER JOIN
                    [Comanche].[dbo].WeatherStationData ON POIData.Timestamp_UTC = WeatherStationData.Timestamp_UTC

        WHERE       DATEADD(HOUR,-6,POIData.Timestamp_UTC) >= '2022-05-01' and DATEADD(HOUR,-6,POIData.Timestamp_UTC) < '2022-06-01'
        GROUP BY    POIData.Timestamp_UTC
    ),
    
    CTE_2 AS
    (
        SELECT  *,
                datepart(YY,DATEADD(HOUR,-6,[TimeDate])) as [Year],
                datepart(MM,DATEADD(HOUR,-6,[TimeDate])) as [Mon],
                datepart(DD,DATEADD(HOUR,-6,[TimeDate])) as [Day],
                AVG(CASE
                        WHEN [Inv_Count]<300
                        THEN [Inv_Count]/300
                        ELSE 1
                    END) AS 'Availability_InvTime(%)',

                (SUM([Sum_Meter_KWh]) + SUM([Curtailed_Energy_KWh]))/SUM([Sum_Expected_KWh]) as 'Energetic_Avail(%)'

        FROM CTE_1
        GROUP BY    
                    datepart(YY,DATEADD(HOUR,-6,[TimeDate])),
                    datepart(MM,DATEADD(HOUR,-6,[TimeDate])),
                    datepart(DD,DATEADD(HOUR,-6,[TimeDate]))
    )


SELECT * FROM CTE_2
                
ORDER BY    --POIData.Timestamp_UTC,
            [Year], [Mon], [Day]

'''

The code above results in following error:

Msg 8120, Level 16, State 1, Line 1
Column 'CTE_1.TimeDate' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Any suggestions? Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

遮云壑 2025-02-12 20:40:13

怎么样?:

AVG(CASE WHEN Inv_Count < 300 THEN Inv_Count / 300 ELSE 1 END)
    OVER (PARTITION BY CAST(DATEADD(HOUR, -6, TimeDate]) AS DATE))
    AS "Availability_InvTime(%)",

(
    SUM([Sum_Meter_KWh])         OVER (PARTITION BY CAST(DATEADD(HOUR, -6, TimeDate]) AS DATE))
    +
    SUM([Curtailed_Energy_KWh])) OVER (PARTITION BY CAST(DATEADD(HOUR, -6, TimeDate]) AS DATE))
)   /
    SUM([Sum_Expected_KWh])      OVER (PARTITION BY CAST(DATEADD(HOUR, -6, TimeDate]) AS DATE))
    AS "Energetic_Avail(%)"

小心整数部门。您至少有一个正在进行的人。

How about this?:

AVG(CASE WHEN Inv_Count < 300 THEN Inv_Count / 300 ELSE 1 END)
    OVER (PARTITION BY CAST(DATEADD(HOUR, -6, TimeDate]) AS DATE))
    AS "Availability_InvTime(%)",

(
    SUM([Sum_Meter_KWh])         OVER (PARTITION BY CAST(DATEADD(HOUR, -6, TimeDate]) AS DATE))
    +
    SUM([Curtailed_Energy_KWh])) OVER (PARTITION BY CAST(DATEADD(HOUR, -6, TimeDate]) AS DATE))
)   /
    SUM([Sum_Expected_KWh])      OVER (PARTITION BY CAST(DATEADD(HOUR, -6, TimeDate]) AS DATE))
    AS "Energetic_Avail(%)"

Be careful about integer division. You have at least one of those going on.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文