联接两个SELECT语句结果


174

是否可以SELECT在一条语句中加入2条sql 语句的结果?我有一个任务数据库,其中每个记录都是一个单独的任务,带有截止日期(并且a PALTINT从开始到截止日期只是几天。 Age也是INT几天)。

我想要一个表,其中包含表中的每个人,他们拥有的LATE任务数以及他们拥有的任务数(如果有)。

我可以轻松地在单独的表中获取此数据,如下所示:

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks

返回数据,如:

ks        # Tasks
person1   7
person2   3

然后我有:

SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

返回:

ks        # Late
person1   1
person2   1

我想加入这两个select语句的结果(通过KS

我试图避免使用临时表,但是如果这是唯一可行的方法,那么我想了解更多有关以这种方式使用临时表的信息。

我也尝试做一些count()满足条件的行,但是我也不知道怎么做。如果可能的话,那也可以。

附录:对不起,我想我的结果有列KSTasksLate

KS        # Tasks   # Late
person1   7         1
person2   3         1
person3   2         0  (or null)

另外,即使他们没有迟到的任务,我也希望一个人出现。

SUM(CASE WHEN Age > Palt THEN 1 ELSE 0 END) Late
效果很好,谢谢您的回答!

两个select语句也可以工作,使用a LEFT JOIN将它们联接也可以,并且我现在了解如何以select这种方式联接多个s


您尚未给出预期结果的示例。因此,某些答案是连接结果。一些正在加入。你想要哪一个?
Phil

抱歉,我希望我的结果中包含“ KS”,“任务”和“后期KS”列。#任务#Lateperson1 7 1 person2 3 1 person3 2 0(或null)另外,即使他们没有后期任务,我也希望有人出现。当前使用带有LEFT JOIN的两个select语句方法来实现此目的(与建议的INNER JOIN相反,INNER JOIN可以工作,但是由于第二个SELECT中不存在没有迟到任务的人,因此也无法实现)列为SUM(年龄> Palt THEN 1 ELSE 0 END时的情况)
sylverfyre 2012年

Answers:


263
SELECT t1.ks, t1.[# Tasks], COALESCE(t2.[# Late], 0) AS [# Late]
FROM 
    (SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks) t1
LEFT JOIN
    (SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks) t2
ON (t1.ks = t2.ks);

1
效果很好,尽管我没有指定我想要一个LEFT JOIN,以便即使有0个后期任务也能显示记录。
sylverfyre,2012年

之所以接受此答案,是因为它回答了我问的最好的问题,并且它的格式被设置为JOINing SELECT语句的很好参考:)
sylverfyre,2012年

很好的答案,但是有人能说出这种“解决方案”被认为是昂贵的还是仅取决于您使用它的目的?
petrosmm

70

尝试这样的事情:

SELECT 
* 
FROM
(SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks) t1 
INNER JOIN
(SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks) t2
ON t1.ks = t2.ks

4
我无法获得公认的工作答案,但这对我的需求非常有用。谢谢。
benvenker '16

像魅力一样工作。就我而言,这应该是公认的答案。谢谢。
nocdib

为我工作!谢谢!我也尝试使用多个查询(多个联接),它也很不错。如果有人想知道您可以在示例中的最后一个“ ON”之后添加更多JOIN,并继续使用以下序列:ON .... X JOIN(QUERY N -1)ON Y = ZX JOIN(QUERY N)ON Y = Z
cesarmart

43

用途UNION

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
UNION
SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

或者,UNION ALL如果您想重复:

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
UNION ALL
SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

3
联合或联合全部结果将只有2列。他想要3个在哪里
SurajS

14

如果Age和Palt是同一张表中的列,则可以对所有任务进行计数(*)并仅对滞后的任务求和,如下所示:

select ks,
       count(*) tasks,
       sum(case when Age > Palt then 1 end) late
  from Table
 group by ks

1
这正是我想要的,但不知道如何寻找。我没想到要使用SUM(CASE)-谢谢。
sylverfyre,2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.