2012-03-15 71 views
3

我对SQL很陌生,并且试图做一些事情而不是愚蠢的方式。为了给出一些背景,我正在比较运营商分支机构的规划和实际使用情况,并且需要统计两者的发生情况。我有一个with subquery as返回类似以下在sql中加入计数

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。

回答

7

尝试:

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 
+0

这一工程!这似乎有点复杂,我选择答案是因为更多的人喜欢它。这需要一些时间来理解这两个答案...... – 2012-03-15 16:17:33

+1

它可能*看起来*更复杂,但它只需要两次读取表格,而不是2次(n + 1)读取Simon解决方案所需的读数。 – 2012-03-15 16:52:28

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 
+0

谢谢,这也适用!尽管如此,我不得不花费一些时间来了解如何使用'group by':) – 2012-03-15 16:14:30