【问题标题】:How to do 2 different counts on the same query SQL?如何对同一个查询 SQL 进行 2 个不同的计数?
【发布时间】:2021-09-24 07:47:47
【问题描述】:

我已经加入了 2 张桌子

SELECT ccc.supplier_id as supplier_id, c1.name as supplier, ccc.dealer_id as dealer_id, c2.name as dealer
FROM company_companyconnection ccc 
left JOIN companies_company c1 ON c1.id = ccc.supplier_id
left JOIN companies_company c2 on c2.id = ccc.dealer_id
ORDER BY supplier_id ASC

这样我得到的结果如下:

supplier_id supplier dealer_id dealer
1 company1 3 company3
1 company1 2 company2
2 company2 3 company3

现在我想对同一个查询进行 2 次不同的计数,以便我可以看到计数是双向的,例如

company_id company as_supplier_count as_dealer_count
1 company1 2 0
2 company2 1 1
3 company3 0 2

到目前为止我已经做到了

SELECT ccc.supplier_id as company_id, c1.name as company, count(ccc.dealer_id) as as_supplier_connections
FROM company_companyconnection ccc 
left JOIN companies_company c1 ON c1.id = ccc.supplier_id
JOIN companies_company c2 on c2.id = ccc.dealer_id
GROUP BY ccc.supplier_id, c1.name
ORDER BY supplier_id ASC
company_id company as_supplier_count
1 company1 2
2 company2 1
3 company3 0

但我在最后阶段遇到了麻烦,任何帮助都会非常感谢您!

【问题讨论】:

    标签: sql postgresql join count


    【解决方案1】:

    您可以取消透视和聚合:

    SELECT cc.*,
           count(*) filter (where v.which = 'supplier') as num_supplier,
           count(*) filter (where v.which = 'dealer') as num_dealer
    FROM companies_company cc left join
         (company_companyconnection ccc cross join lateral
          (values (supplier_id, 'supplier'),
                  (dealer_id, 'dealer')
          ) v(company_id, which)
         )
         on v.company_id = cc.id
    group by cc.id;
    

    注意:group by cc.id 假定companies_company(id) 是表的主键(或至少声明为unique)。否则,您需要同时列出selectgroup by 中的列。

    【讨论】:

      猜你喜欢
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多