JOIN两个SELECT语句结果

时间:2012-05-10 16:36:35

标签: sql select join group-by

是否可以在一个语句中加入2个sql SELECT语句的结果? 我有一个任务数据库,其中每个记录都是一个单独的任务,有截止日期(和PALT,这只是从开始到截止日期的INT天数。年龄也是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

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

我正在尝试避免使用临时表,但如果这是实现此目的的唯一实用方法,我想了解更多关于以这种方式使用临时表的信息。

我也尝试过某种满足条件的count()行数,但我也想不出怎么做。如果有可能,那也会有效。

附录: 抱歉,我希望我的结果包含KS,任务和延迟

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

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

SUM(年龄> Palt THEN 1 ELSE 0 END)的情况 效果很好,谢谢你的答案!

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

5 个答案:

答案 0 :(得分:214)

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 :(得分:53)

尝试这样的事情:

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

答案 2 :(得分:32)

使用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 :(得分:13)

您可以使用UNION ALL关键字。

以下是在T-SQL http://msdn.microsoft.com/en-us/library/ms180026.aspx

中执行此操作的MSDN文档

UNION ALL - 结合结果集

UNION-像Set Union这样的东西并没有输出重复值

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

答案 4 :(得分:13)

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

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