sql中的连接计数
我对SQL非常陌生,正在尝试用一种不愚蠢的方式做一些事情。为了提供一些背景信息,我比较了运营商分支机构中车辆的规划和实际使用情况,需要计算两者的发生率。我有一个子查询为的sql中的连接计数,sql,join,union,Sql,Join,Union,我对SQL非常陌生,正在尝试用一种不愚蠢的方式做一些事情。为了提供一些背景信息,我比较了运营商分支机构中车辆的规划和实际使用情况,需要计算两者的发生率。我有一个子查询为的,返回如下内容 PLANNED | REALIZED ---------+---------- TRUCK | BI-TREM TRUCK | TRUCK TRUCK | TRUCK TRUCK | TRUCK TRUCK | TRUCK CARRETA | CARRETA CARRETA |
,返回如下内容
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
我想返回如下内容
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
我试过以下方法
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
我还使用子查询尝试了所有可用的联接,但没有成功。事实上,右连接
起作用,但这只是因为所有计划的车辆也在已实现侧:如果一些车辆不在,我将在车辆
列中使用空值
感谢您的帮助,即使只是一个指向SQL命令的指针
注:此查询必须同时在SQL Server和Oracle上运行,因此我正在努力实现纯SQL。尝试:
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
我认为这应该奏效:
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
谢谢,那也行!尽管如此,我还是要花一些时间来了解它是如何工作的,而不必使用groupby
:)!这似乎有点复杂,我选择这个答案只是因为更多的人喜欢它。理解这两个答案需要一些时间…它可能看起来更复杂,但它只需要两次读取表格,而Simon的解决方案需要两次(n+1)读取。