【问题标题】:JOIN two SELECT statement resultsJOIN 两个 SELECT 语句结果
【发布时间】:2012-05-19 07:02:37
【问题描述】:

是否可以在一个语句中加入 2 个 sql SELECT 语句的结果? 我有一个任务数据库,其中每条记录都是一个单独的任务,有截止日期(和PALT,这只是从开始到截止日期的INTAge 也是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 语句也可以,使用 LEFT JOIN 加入它们也可以,我现在了解如何以这种方式加入多个 selects

【问题讨论】:

  • 您没有给出预期结果的示例。因此,一些答案是连接结果。一些正在加入。你要哪一个?
  • 抱歉,我希望我的结果包含 KS、Tasks 和 Late KS #Tasks # Late person1 7 1 person2 3 1 person3 2 0(或 null)即使他们没有迟到的任务。目前使用带有 LEFT JOIN 的两个 select 语句方法来实现这一点(与建议的 INNER JOIN 不同,它可以工作但不会显示没有迟到任务的人,因为他们不存在于第二个 SELECT 中也可以用迟到的方法实现这一点列是 SUM(CASE WHEN Age > Palt THEN 1 ELSE 0 END) Late

标签: sql select join group-by


【解决方案1】:
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);

【讨论】:

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

如果 Age 和 Palt 是同一个 Table 中的列,您可以对所有任务进行计数(*)并仅对迟到的任务求和,如下所示:

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

【讨论】:

  • 这正是我想要的,但不知道如何寻找它。我没想过使用 SUM(CASE) - 谢谢。
【解决方案3】:

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

【讨论】:

  • Union 或 Union All 在结果中只有 2 列。他想要 3 个在哪里
  • 非常适合我的用例!谢谢!
【解决方案4】:

试试这样的:

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

【讨论】:

  • 我无法获得公认的工作答案,但这对我的需求非常有用。谢谢。
  • 工作就像一个魅力。就我而言,这应该是公认的答案。谢谢。
  • 为我工作!谢谢!我还尝试使用多个查询(多个联接),它也很棒。如果有人想知道您可以在示例中的最后一个“ON”之后添加更多 JOIN,并继续使用序列: ON .... X JOIN (QUERY N -1) ON Y = ZX JOIN (QUERY N) ON Y = Z
【解决方案5】:

您可以为此使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-18
    • 2019-08-30
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    相关资源
    最近更新 更多