是否可以在一个语句中加入 2 个 sql SELECT
语句的结果?我有一个任务数据库,其中每条记录都是一个单独的任务,有截止日期(和 PALT
,从开始到截止日期只是 INT
天。Age
也是 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()
,但我也不知道该怎么做。如果可能的话,那也行。
附录:抱歉,我希望我的结果包含 KS
、Tasks
和 Late
列
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
加入它们也可以,我现在了解如何以这种方式加入多个 select
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);
尝试这样的事情:
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
使用 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
如果 Age 和 Palt 是同一个表中的列,则可以对所有任务进行计数(*)并仅对迟到的任务求和,如下所示:
select ks,
count(*) tasks,
sum(case when Age > Palt then 1 end) late
from Table
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
EXPLAIN ANALYZE
同时运行多个查询进行比较