JOIN两个SELECT语句结果

syl*_*yre 156 sql select join group-by

是否可以在一个语句中加入2个sql SELECT语句的结果?我有任务的数据库,其中每个记录是一个单独的任务,最后期限(和P替换,这仅仅是一个从开始到最后期限的天INT,年龄也是天的INT数.)

我想有哪个人都有每个人的桌子上,他们有任务的数量,以及他们有LATE任务数表(如果有的话).

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

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
Run Code Online (Sandbox Code Playgroud)

返回数据如:

ks        # Tasks
person1   7
person2   3
Run Code Online (Sandbox Code Playgroud)

然后我有

SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks
Run Code Online (Sandbox Code Playgroud)

返回:

ks        # Late
person1   1
person2   1
Run Code Online (Sandbox Code Playgroud)

我想加入这两个选择语句的结果(由KS提供)

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

我也尝试做某种count()#行满足条件,但我也想不出怎么做.如果可能的话,那也会奏效.

附录:对不起,我希望我的结果包含KS,Tasks和Late的列

KS        # Tasks   # Late
person1   7         1
person2   3         1
person3   2         0  (or null)
Run Code Online (Sandbox Code Playgroud)

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

SUM(年龄> Palt THEN 1 ELSE 0 END)后期效果很好,感谢您的回答!

两个select语句也可以工作,使用LEFT JOIN加入它们也可以工作,我现在明白了如何以这种方式连接多个选择.谢谢!

Phi*_*hil 238

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);
Run Code Online (Sandbox Code Playgroud)

  • 这很有效,虽然我没有指定我想要一个 LEFT JOIN 以便记录显示,即使它们有 0 个延迟任务。 (4认同)
  • 接受这个答案,因为它回答了我问得最好的问题,并且它的格式是关于 JOINing SELECT 语句的一个很好的参考:) (2认同)
  • @petrosmm我问自己同样的事情,但我想这取决于记录的大小以及你如何索引你的表。然后,您还应该使用“EXPLAIN ANALYZE”将此查询与同时运行多个查询进行比较 (2认同)

Mit*_*dir 63

尝试这样的事情:

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
Run Code Online (Sandbox Code Playgroud)

  • 我无法获得公认的工作答案,但这对我的需求非常有用。谢谢。 (4认同)

aF.*_*aF. 36

用途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
Run Code Online (Sandbox Code Playgroud)

或者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
Run Code Online (Sandbox Code Playgroud)

  • 联合或联合全部结果将只有2列。他想去哪里3个 (3认同)

Baz*_*nga 13

你可以使用UNION ALL关键字.

以下是在T-SQL中执行此操作的MSDN文档http://msdn.microsoft.com/en-us/library/ms180026.aspx

UNION ALL - 组合结果集

UNION-类似Set Union,不输出重复值

对于与示例的区别:http://sql-plsql.blogspot.in/2010/05/difference-between-union-union-all.html


Nik*_*vić 13

如果Age和Palt是同一个表中的列,您可以计算(*)所有任务,并且只计算后期的任务,如下所示:

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