MySQL使用同一个表中的CASE连接COUNT()和SUM()

时间:2014-08-06 21:23:13

标签: mysql sql join count sum

我在以下一对多关系中有以下表格:

company_company,company_portfolio,building_site和statistics_meter。我遇到的难度是决赛桌,statistics_meter。

为了本练习的利益,它的结构如下:

记录在同一张表中相关,其中一些是父米,有些是子米。如果一个记录是一个子记录,那么它将设置parent_meter_id,而关键的是,这个表是LEFT JOIN的设置为NULL的方式。

 id  | parent_meter_id | site_ref            | building_id
 1   | NULL            | some building       | 45
 2   | NULL            | some other building | 45
 3   | 1               | and another         | NULL
 4   | 1               | one another one     | NULL
 5   | 2               | final one           | NULL

我有两个要求:

1 - 计算设置building_id的父级数量(我正在成功完成)

2 - 计算parent_meter_id与(1)中计数的meter_id匹配的米数

因此,我期望得到(1)= 2和(2)= 3的结果。

这是我到目前为止的SQL ...我试图摆弄一个SUM案例,但我认为这是完全错误的。这在一个查询中是否可能?

感谢您的帮助。

        SELECT
        building_site.id as site_id,
        building_site.site_ref as building_name,
        COUNT(statistics_meter.id) AS meter_count,
        SUM(CASE WHEN statistics_meter.parent_meter_id = [???] THEN 1 ELSE 0 END) AS check_meter_count
        FROM company_company
        LEFT JOIN company_portfolio ON company_portfolio.company_id=company_company.id
        LEFT JOIN building_site ON building_site.portfolio_id=company_portfolio.id
        LEFT JOIN statistics_meter ON statistics_meter.building_id=building_site.id
        WHERE company_company.id=41
        GROUP BY building_site.id

2 个答案:

答案 0 :(得分:1)

如果我了解您,您需要使用子查询来获取具有建筑物ID的父计量表,然后将其加入主表。 SQL Fiddle

select
sm.id,
sm.parent_meter_id,
sm2.id as ID2,
sm.site_ref,
sm.building_id
from
statistics_meter sm
inner join (
  select
  id,
  parent_meter_id
  from
  statistics_meter
  where
  building_id is not null) sm2
  on sm.parent_meter_id = sm2.id

答案 1 :(得分:0)

不确定这是否是最有效的方法,但最后我执行了左连接和子查询,如下所示,并执行了两个计数,一个COUNT()总数来回答我的要求(2)和COUNT(不同)回答我的要求(1)

        SELECT
        count(distinct statistics_meter.id) as meter_count,
        count(statistics_meter.id) as check_meter_count
        FROM company_company
        LEFT JOIN company_portfolio ON company_portfolio.company_id=company_company.id
        LEFT JOIN building_site ON building_site.portfolio_id=company_portfolio.id
        LEFT JOIN statistics_meter ON statistics_meter.building_id=building_site.id
        LEFT JOIN (select * from statistics_meter where parent_meter_id is not NULL) sm2 on sm2.parent_meter_id = statistics_meter.id