【问题标题】:CASE statement with Subquery in SQL ServerSQL Server 中带有子查询的 CASE 语句
【发布时间】:2018-09-13 01:15:57
【问题描述】:

请查看我的 sql 查询。

select 
CASE 
    WHEN (SELECT COUNT(COL1) FROM FACT_ACTIVITY group BY FACT_ACTIVITY.COL2)>1
            THEN (SELECT COUNT(COL3) FROM FACT_ACTIVITY) 
    WHEN (SELECT COUNT(COL1) FROM FACT_ACTIVITY group BY FACT_ACTIVITY.COL2)=1
            THEN (SELECT COUNT(COL4) FROM FACT_ACTTIVITY)
            END
,EXTRACT(year from fa.INC_START_DATETIME) AS YearOFF
,COUNT(fa.COL2) AS OffCount from FACT_ACTIVITY fa INNER JOIN
DIM_OFF_TYPE do ON fa.OFF_TYPE_ID = do.OFF_TYPE_ID
WHERE fa.OFF_TYPE_ID IN (24001) and YEAR(fa.INC_START_DATETIME) IN (2016,2017)
group by do.OFF_TYPE_DESCR,YEAR(fa.INC_START_DATETIME)

子查询以防 WHEN 给出很多行,但我希望子查询检查每个 FACT_ACTIVITY_ID 并查看 count(col2) >1 并执行 THEN 语句。

【问题讨论】:

  • 那是一个case 表达式,而不是一个语句。
  • 我使用的是 SQL Server 2008。

标签: sql sql-server group-by subquery case


【解决方案1】:

对于为每个 FACT_ACTIVITY_ID 返回一行的子查询,您必须将该过滤器放在 WHERE 子句中:

SELECT 
            CASE 
                WHEN (SELECT    COUNT(COL1) 
                      FROM      FACT_ACTIVITY fa2 
                      WHERE     fa2.FACT_ACTIVITY_ID = fa.FACT_ACTIVITY_ID 
                      GROUP BY  FACT_ACTIVITY.COL2) > 1
                    THEN (SELECT COUNT(COL3) FROM FACT_ACTIVITY) 

                WHEN (SELECT    COUNT(COL1) 
                      FROM      FACT_ACTIVITY fa2 WHERE fa2.FACT_ACTIVITY_ID = fa.FACT_ACTIVITY_ID
                      GROUP BY  FACT_ACTIVITY.COL2)=1
                        THEN (SELECT COUNT(COL4) FROM FACT_ACTTIVITY)
                END AS GiveMeAnAlias
            ,EXTRACT(year from fa.INC_START_DATETIME) AS YearOFF
            ,COUNT(fa.COL2) AS OffCount 
FROM        FACT_ACTIVITY fa 
            INNER JOIN DIM_OFF_TYPE do ON fa.OFF_TYPE_ID = do.OFF_TYPE_ID
WHERE       fa.OFF_TYPE_ID IN (24001) 
                AND YEAR(fa.INC_START_DATETIME) IN (2016,2017)
GROUP BY    do.OFF_TYPE_DESCR,
            YEAR(fa.INC_START_DATETIME)

注意子查询中表 FACT_ACTIVITY“fa2”的表别名,以区分子查询中的 FACT_ACTIVITY 与外部主查询中的 FACT_ACTIVITY。

还要注意良好的空白和制表符的可读性和可维护性:)

【讨论】:

  • 我不想限制 FACT_ACTIVITY_ID。我希望子查询检查所有 FACT_ACTIVITY_ID,然后一一执行 THEN。
  • 不清楚您希望最终输出是什么。您可以使用示例表数据和示例预期输出来编辑您的原始问题吗?
猜你喜欢
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2014-10-13
  • 2022-01-06
相关资源
最近更新 更多