繁体   English   中英

我想结合两个 sql 查询 resukt

[英]I want to combine two sql queries resukt

我想结合两个查询的查询结果和最终结果显示

我试过工会,但没有用

Select Distinct PersonNameWorked, COUNT(ProcessInstanceAppianId)as Num_Of_Jobs,  sum(ExpectedTaskEffort) as Workunits,
cast((cast((sum(TaskInstanceEffort) / 60.00) as Decimal(5,2)))/count (Distinct  cast(TaskInstanceCompleted as date) ) as Decimal(5,2)) as WorkingHours,
ROUND((1.00- sum(CAST(TaskInstanceEffort AS FLOAT))/sum(CAST(ExpectedTaskEffort AS FLOAT)))*100,2) as EfforVariance
from pathfinder..PFTask

where TaskInstanceCompleted  between '2019-9-03 00:30:00' and '2019-9-04 00:30:00'
  and KeyProcessStream in (26769,26768,28788,26760,26761,26755,29529)
and KeyPerson in (1347718,1332622,619682)
--and ProcessInstanceAppianId='-2136985491'
--and TaskInstanceCompleted
group by PersonNameWorked, KEYPERSON
order by PersonNameWorked asc
union all
select PersonNameWorked, cast(sum(PFTaskInstanceRating)*1.00/count(distinct ProcessInstanceAppianId) as decimal (5,2))as Rating
from pathfinder..PFTask
where TaskInstanceCompleted  between '2019-9-03 00:30:00' and '2019-9-04 00:30:00'
and KeyPerson in (1347718,1332622,619682)
and PFTaskInstanceRating is not null
group by PersonNameWorked, KEYPERSON
order by PersonNameWorked asc 

消息 156,级别 15,状态 1,第 17 行 关键字“union”附近的语法不正确。

对于union all/union您需要在您的案例中缺少的两个查询中具有相同数量的列 - 所以它会引发错误

Select Distinct PersonNameWorked, COUNT(ProcessInstanceAppianId)as Num_Of_Jobs,  sum(ExpectedTaskEffort) as Workunits,
cast((cast((sum(TaskInstanceEffort) / 60.00) as Decimal(5,2)))/count (Distinct  cast(TaskInstanceCompleted as date) ) as Decimal(5,2)) as WorkingHours,
ROUND((1.00- sum(CAST(TaskInstanceEffort AS FLOAT))/sum(CAST(ExpectedTaskEffort AS FLOAT)))*100,2) as EfforVariance
from pathfinder..PFTask
where TaskInstanceCompleted  between '2019-9-03 00:30:00' and '2019-9-04 00:30:00'
  and KeyProcessStream in (26769,26768,28788,26760,26761,26755,29529)
and KeyPerson in (1347718,1332622,619682)
--and ProcessInstanceAppianId='-2136985491'
--and TaskInstanceCompleted
group by PersonNameWorked, KEYPERSON

union all

select PersonNameWorked, null,null,null,cast(sum(PFTaskInstanceRating)*1.00/count(distinct ProcessInstanceAppianId) as decimal (5,2))as Rating
from pathfinder..PFTask
where TaskInstanceCompleted  between '2019-9-03 00:30:00' and '2019-9-04 00:30:00'
and KeyPerson in (1347718,1332622,619682)
and PFTaskInstanceRating is not null
group by PersonNameWorked, KEYPERSON

作为对 fa06s 答案的补充,因为他提出了一个非常好的观点,即您的列数需要在两个查询之间相等,因此该错误是由您尝试对每个查询进行 ORDER BY 引起的,然后执行联合:

在此处输入图片说明

在 UNION 之前,您不能按每个查询 ORDER BY。 最后,在所有联合之后,您执行 ORDER BY 一次。

对:

SELECT.. 
FROM ... 
UNION 
SELECT ... 
FROM ... 
ORDER BY ... <-- just order by once. It works on the whole union output

错误的:

SELECT.. 
FROM ...
ORDER BY ... <-- don't do it here as well
UNION 
SELECT ... 
FROM ... 
ORDER BY ...

ORDER BY 最后由 SQL 处理,在联合完成后。 ORDER BY 使用联合中第一个查询定义的列名:

SELECT a FROM table1
UNION 
SELECT b FROM table2
UNION 
SELECT c FROM table3
ORDER BY a            <--the column is named after whatever the first query called it

如果有帮助,请在内部将其视为这样:

SELECT * FROM
(
  SELECT a 
  UNION 
  SELECT b 
  UNION 
  SELECT c  
) x
ORDER BY x.a

删除 ORDER BY 后,您将面临有关列数的错误:

在此处输入图片说明

合并的查询必须具有相同的列数,因为结果集垂直粘在一起:查询 1 上的 5 列必须与查询 2 上的 5 列匹配,以便查询 1 中的 50 行和查询 2 中的 100 行可以成为一个 150 行长的结果集。

如果查询 2 等中的某些列没有任何值,请将它们设为 null:

  SELECT 1 as a, 2 as b
  UNION 
  SELECT 2, null         <-- there are no values for column b for this query,
                             so just use a constant value like 0, 1, null..
                             whatever is appropriate
  ORDER BY a

还要注意,因为联合中的第一个查询定义了列名,所以在第二个查询中为列设置别名的唯一目的是使代码更具有自文档性。 它没有功能性目的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM