是否有可能在一条语句中加入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

我想把这两个select语句的结果连接起来(通过KS)

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

我还尝试了一些满足条件的行计数(),但我也不知道如何做到这一点。如果可能的话,那也可以。

附录: 对不起,我想我的结果有列KS,任务,和晚

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

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

SUM(CASE WHEN Age > Palt THEN 1 ELSE 0 END)晚 工作得很好,谢谢你的回答!

两个选择语句也可以,使用LEFT JOIN来连接它们也可以,现在我明白了如何以这种方式连接多个选择


当前回答

试试这样做:

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

其他回答

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);

如果Age和Palt是同一个表中的列,你可以计算(*)所有的任务,并只对较晚的任务求和,如下所示:

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

使用联盟:

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

你可以使用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

试试这样做:

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