【问题标题】:Add column to SQL result based on result of first query根据第一次查询的结果将列添加到 SQL 结果
【发布时间】:2021-07-23 03:11:17
【问题描述】:

我觉得应该是一个简单的查询。

我有两张桌子,单位和活动。我的第一个查询是:

select u.unit, u.group, e.zone  
from units u 
left join event e
on u.id = e.id
where u.ag_id = 'FIRE' and u.numbr = 'G0182' and u.status > 1

结果在哪里:

Unit | Group | Zone
M1      44G     8
M2      50F     7

然后我运行另一个查询以确定每个组中有多少总单位处于活动状态:

select count(1) from units where group = '[result]' and status > 1

其中 [result] 是第一个查询的组输出(44G、50F 等)

我想在我的第一个查询中添加第 4 列,它只是添加该行的总数,如下所示:

Unit | Group | Zone | Active
M1      44G     8       4
M2      50F     7       3

如何链接这些查询以在一个语句中完成所有操作?

谢谢!

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    当您想要使 SQL 结果集更宽时,您可以使用 JOIN

    select u.unit, u.group, e.zone, x.ctr
    from units u 
    left join event e on u.id = e.id
    
    INNER JOIN(select group , count(*) as ctr from units where status > 1 GROUP BY group) X ON X.group = u.group
    
    
    where u.ag_id = 'FIRE' and u.numbr = 'G0182' and u.status > 1
    

    在我看来,第一个查询将排除您以后想要计算的项目(由于它的 where 子句)。这意味着您可以根据新要求返回源数据 (where status > 1),然后将它们分组并计入一个单独的结果中,然后将其作为子查询放入并加入。

    请记住,表格可以在一个查询中出现多次;表只是一个数据块,选择的输出也是如此。 SQL Server 将数据块连接到其他数据块,它不关心它是表还是由查询的输出形成的。

    使数据块更宽 - JOIN,更高 - UNION,更短 - WHERE,更窄 - SELECT。大多数情况下,SQL 是关于分割数据块并将它们重新组合在一起以形成不同形状的矩形:D

    【讨论】:

    • 太棒了!它几乎可以工作,但我得到“无法绑定多部分标识符“u.group”。”你的解释也有助于想象我想做的事情。我将其视为结果而不是数据块。
    • 我花了一些时间四处搜索,但仍然遇到这个多部分标识符错误。在我看来,第二个加入应该能够看到 u.group。
    • 抱歉,当我将 left join event e 与其 on 子句分开时,我打错了 - 请参阅编辑
    【解决方案2】:

    你可以使用窗口函数:

    select u.unit, u.group, e.zone, u.cnt  
    from (select u.*,
                 sum(case when status > 1 then 1 else 0 end) over (partition by u.group) as cnt
          from units u 
         ) u left join
         event e
         on u.id = e.id
    where u.ag_id = 'FIRE' and u.numbr = 'G0182' and u.status > 1
    

    【讨论】:

      【解决方案3】:
      SELECT *
      FROM
        (SELECT u.unit,
                u.group,
                e.zone,
                count(u.group) over(partition BY u.group) active
         FROM units u
         LEFT JOIN event e ON u.id = e.id
         WHERE u.status > 1) uu
      WHERE uu.ag_id = 'FIRE'
        AND uu.numbr = 'G0182'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-07
        • 2018-03-20
        相关资源
        最近更新 更多