首页 文章

JOIN两个SELECT语句结果

提问于
浏览
125

是否可以在一个语句中加入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,Tasks和Late的列

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 回答

  • 46
    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);
    
  • 13

    尝试这样的事情:

    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
    
  • 31

    使用 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
    
  • 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

  • 199

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

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

相关问题