【问题标题】:SQL using Top 5 Results as a filterSQL 使用前 5 个结果作为过滤器
【发布时间】:2021-07-09 22:40:55
【问题描述】:

我需要找出 SQL 机制,以使用我用 CTE 计算的 5 个类别来过滤我的整体结果。当我用逗号“加入”时:从表中,结果会成倍增加。由于 cte 中的计数计算,我真的没有一个字段可以进行正确的连接。

我觉得它应该是 where 语句中的子查询,但我有 5 个结果,我认为它只适用于 1 个结果。

我已经尝试过(尽我所能)cte,各种子查询,有,存在

工作 CTE:

DECLARE @END VARCHAR(25)='2021-04-04 23:59:59.000'  --Sunday

DECLARE @START DATEtime = DATEADD(DD,-364,@END)

;With CTE as (

Select Top 5

          TIER_3 

         ,COUNT(INCIDENT_NUMBER) AS CTE_Count    

    FROM vIncidentTickets

   WHERE LAST_RESOLVED_DATE between @START and @END

     AND GROUP = 'Cell'

     AND COMPANY = 'HQ'

     AND ORGANIZATION = 'CSS'

GROUP BY TIER_3

ORDER BY COUNT(INCIDENT_NUMBER) DESC
)

--选择部分没有提供正确的结果

Select    
          INCIDENT_NUMBER

         ,CTE.TIER_3 

    FROM vIncidentTickets,CTE

   WHERE LAST_RESOLVED_DATE between @START and @END

     AND GROUP = 'Cell'

     AND COMPANY = 'HQ'

     AND ORGANIZATION = 'CSS'

我希望 CTE 结果过滤 Select 查询。

【问题讨论】:

    标签: sql filter subquery common-table-expression


    【解决方案1】:

    不要使用逗号加入。使用JOIN关键字的标准已经近30年了,习惯了就用吧。

    特别是通过使用INNER JOIN,很明显您没有包含任何关联两个表的条​​件(无连接谓词)。

    试试这个吧……

    Select    
          v.INCIDENT_NUMBER
         ,CTE.TIER_3 
    FROM
        vIncidentTickets   AS v
    INNER JOIN
        CTE
            ON CTE.TIER_3 = v.TIER_3
    WHERE
         v.LAST_RESOLVED_DATE between @START and @END
     AND v.GROUP = 'Cell'
     AND v.COMPANY = 'HQ'
     AND v.ORGANIZATION = 'CSS'
    

    (您的原始查询有效地使用了CROSS JOIN。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 2022-01-03
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      相关资源
      最近更新 更多