【问题标题】:Adding additional column in SQL query, which contains same info as previous, but more filtered在 SQL 查询中添加附加列,该列包含与以前相同的信息,但过滤更多
【发布时间】:2023-03-06 09:44:02
【问题描述】:

我在 SQL 查询中添加额外的列,其中包含与其他列相同的信息,但经过更多过滤,我遇到了这种困难(对 SQL 有点菜鸟)。我举个例子解释一下:

SELECT 
    aMain.MaintGroupName,
    CCALARMS = (SELECT COUNT(ALARMIDKEY) --subquery begins
                FROM REPORTER.REPORTER_STATUS
                WHERE
                    (MAINTMODECRONTAB != 'Y'
                     AND SUPPRESSESCL < 4
                     AND SPMAUTO != 1
                     AND ORIGINALSEVERITY > 0)
                     AND ((AIWAVER = 3 AND EVENTACTOR = 1)
                          OR
                          ((AIWAVER < 3 OR AIWAVER IS NULL)
                           AND ((CONTROLCENTREVIEW = 1
                                 AND ORIGINALSEVERITY = 5)
                                OR (CONTROLCENTREVIEW = 2)
                                OR (ALERTGROUP = 'CHECKLIST')
                               )
                          )
                         )
               ), --subquery ends
    COUNT(rSTA.ALARMIDKEY) -- same column as previous, but with no conditions
FROM 
    REPORTER.reporter.REPORTER_STATUS rSTA
INNER JOIN
    AIWA2.dbo.MaintGroup aMain ON aMain.MaintGroupId = rSTA.ALARMOWNERID
GROUP BY 
    aMain.MaintGroupName

我希望这可以让我获得组名称、具有特殊条件的警报、没有任何条件的相同警报,并按组名称对所有内容进行分组(向我显示特定警报和每个组的所有警报)。此查询向我显示了组名和正确分组的所有警报,但那些“CCALARMS”仅显示为每个组计数,而不是分组。我应该添加什么条件,以便子查询中的这个计数在查询中被分组?在附加连接中可能需要类似 rSTA.ALARMIDKEY = CCALARM.ALARMIDKEY 的东西?

这是我现在得到的,正如您所看到的,每组 CCALARMS 都被计算在内。想知道我应该如何分发它。 ALARM

希望很清楚我想要实现的目标,如果没有,请告诉我,我会提供更多详细信息。提前致谢!

【问题讨论】:

  • 我们使用的是 Microsoft SQL 服务器。

标签: sql sql-server join subquery left-join


【解决方案1】:

条件聚合:

SELECT 
    aMain.MaintGroupName,
    CCALARMS = COUNT(
                 CASE WHEN                     
                    (MAINTMODECRONTAB != 'Y'
                     AND SUPPRESSESCL < 4
                     AND SPMAUTO != 1
                     AND ORIGINALSEVERITY > 0)
                     AND ((AIWAVER = 3 AND EVENTACTOR = 1)
                          OR
                          ((AIWAVER < 3 OR AIWAVER IS NULL)
                           AND ((CONTROLCENTREVIEW = 1
                                 AND ORIGINALSEVERITY = 5)
                                OR (CONTROLCENTREVIEW = 2)
                                OR (ALERTGROUP = 'CHECKLIST')
                               )
                          )
                         )
                THEN rSTA.ALARMIDKEY END), 
    COUNT(rSTA.ALARMIDKEY) -- same column as previous, but with no conditions
FROM 
    REPORTER.reporter.REPORTER_STATUS rSTA
INNER JOIN
    AIWA2.dbo.MaintGroup aMain ON aMain.MaintGroupId = rSTA.ALARMOWNERID
GROUP BY 
    aMain.MaintGroupName

请检查括号,未测试

【讨论】:

  • 嗯,尽管它需要 +10 分钟,但它似乎提供了某种输出,可能是正确的输出。您知道如何优化查询以更快地运行吗?我想知道是不是因为条件或数据太多而需要一些时间。
  • SELECT 列表中的表达式(假设它们不包括子查询)像这样对执行计划的影响很小。 Sql server Studio 是否建议创建/修改任何索引?
  • 您可能希望打开一个单独的性能问题,指定表和索引定义以及执行计划。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 2016-01-01
  • 2019-12-19
  • 2015-07-08
相关资源
最近更新 更多