【问题标题】:joining counts in sqlsql中的加入计数
【发布时间】:2012-04-01 02:40:56
【问题描述】:

我对 SQL 很陌生,并且正在尝试做一些不愚蠢的事情。为了提供一些背景信息,我正在比较运营商分支中车辆的规划和实现使用,并且需要计算两者的发生情况。我有一个with subquery as,它返回如下内容

PLANNED  | REALIZED
---------+----------
TRUCK    | BI-TREM
TRUCK    | TRUCK
TRUCK    | TRUCK
TRUCK    | TRUCK
TRUCK    | TRUCK
CARRETA  | CARRETA
CARRETA  | CARRETA
TRUCK    | KOMBI
TRUCK    | BI-TREM
CARRETA  | KOMBI
CARRETA  | KOMBI
TRUCK    | TRUCK
CARRETA  | CARRETA
CARRETA  | BI-TREM
CARRETA  | CARRETA
CARRETA  | CARRETA
TRUCK    | BI-TREM

并想返回如下内容

VEHICLE | TOTAL_PLANNED | TOTAL_REALIZED
--------+---------------+---------------
CARRETA | 8             | 5
TRUCK   | 9             | 5
BI-TREM | 0             | 4
KOMBI   | 0             | 3

我尝试了以下方法

select PLANNED, 
       count(*) as TOTAL_PLANNED
       null as REALIZED,
       0 as TOTAL_REALIZED
from subquery
group by PLANNED

union all

select null as PLANNED,
       0 as TOTAL_PLANNED,
       REALIZED,
       count(*) as TOTAL_REALIZED
from subquery
group by REALIZED

返回

CARRETA 8   NULL    0
TRUCK   9   NULL    0
NULL    0   BI-TREM 4
NULL    0   CARRETA 5
NULL    0   TRUCK   5
NULL    0   KOMBI   3

我还使用子查询尝试了所有可用的连接,但没有成功。事实上,RIGHT JOIN 有效,但这只是因为所有计划中的车辆也都在已实现的一侧:如果有些没有,我将在 VEHICLE 列中有一个 NULL。

感谢您的帮助,即使只是指向 SQL 命令的指针。

PS.:这个查询必须同时在 SQL Server 和 Oracle 上工作,所以我正在争取纯 SQL。

【问题讨论】:

    标签: sql join union


    【解决方案1】:

    我认为这应该可行:

    select T.VEHICLE, 
           (SELECT count(*) FROM Table AS T1 WHERE T1.PLANNED = T.VEHICLE) AS TOTAL_PLANNED
           (SELECT count(*) FROM Table AS T2 WHERE T2.REALIZED = T.VEHICLE) AS TOTAL_REALIZED,
    from (SELECT DISTINCT PLANNED AS VEHICLE FROM Table
            UNION SELECT DISTINCT REALIZED AS VEHICLE FROM Table) AS T
    

    【讨论】:

    • 谢谢,这也行得通!不过,我将不得不花一些时间来找出方法,而不使用group by :)
    【解决方案2】:

    试试:

    SELECT PLANNED_REALIZED AS VEHICLE, 
           SUM(TOTAL_PLANNED) AS TOTAL_PLANNED,
           SUM(TOTAL_REALIZED) AS TOTAL_REALIZED
    FROM
    (select PLANNED AS PLANNED_REALIZED, 
            1 as TOTAL_PLANNED
            0 as TOTAL_REALIZED
     from subquery
     union all
     select REALIZED as PLANNED_REALIZED,
            0 as TOTAL_PLANNED,
            1 as TOTAL_REALIZED
     from subquery
    ) SQ
    GROUP BY PLANNED_REALIZED
    

    【讨论】:

    • 行得通!这似乎有点令人费解,我选择作为答案只是因为更多人喜欢它。理解这两个答案需要一些时间......
    • 它可能看起来更复杂,但它只需要两次读取表格,而不是 Simon 的解决方案需要 2 x (n+1) 次读取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多