我有一个查询,没有什么特别的。基本选择和大量联接,但没有高级内容。
我有第二个查询,它使用光标和数据透视。这与我以前做过的查询(SQL noob)一样高级。我想做的是将第二个查询粘贴在第一个查询中,然后将第一个查询的行输出用于第二个查询。令人困惑,我知道。
第二个查询如下:
declare @num as varchar(50)
declare pno cursor for
select
p.part_key
from
part_table as p
where
p.part_status = "Prod"
open pno
fetch next from pno into @num
while @@fetch_status = 0
begin
select
@num as "Part Number",
[id1] as "Data1",
[id2] as "Data2",
[id3] as "Data3"
from
select
t1.qty * t2.cost as ExtCost,
t2.opcode as opcode
from
table1 as t1
join table2 as t2
on t1.id = t2.id
where
t1.part_key = @num
) t
pivot
(sum(extcost) for opcode in [id1], [id2], [id3])) pvt
fetch next from pno into @num
end
close pno
deallocate pno
此查询准确显示我想要的信息,这是我知道可以获取该信息的唯一方法。第一个查询吐出不同的信息,但引用的是我在此数据透视查询中选择的同一组“零件”。因此,我想对第一个查询中的每一行(即part_key)进行处理,我想从第二个查询中吐出与该part_key相关的数据。
例如,第一个查询显示如下内容:
PART KEY | q1DATA1 | q1DATA2
第二个查询出现:
PART KEY | [id1] | [id2] | [id3]
我想做的是这样:
PART KEY | q1DATA1 | q1DATA2 | [id1] | [id2] | [id3]
我尝试查看子查询,但是那些子查询似乎对我的工作有很大的限制。
答案 0 :(得分:1)
只需将另一个JOIN
添加到第二个查询中,就可以将两个查询简化为一个查询。我知道这些FROM
/ WHERE
子句应该可以解决问题:
FROM
part_table as p
INNER JOIN table1 AS t1 ON t1.part_key = p.part_key
INNER JOIN table2 AS t2 ON t2.id = t1.id
WHERE
p.part_status = 'Prod'
在轮换输出时,我确实怀疑可以使用条件聚合完成您要完成的工作。
SELECT
p.part_key,
p.q1DATA1,
p.q1DATA2,
SUM(CASE WHEN t2.opcode = '[id1]' THEN t1.qty * t2.cost ELSE 0 END) id1,
SUM(CASE WHEN t2.opcode = '[id2]' THEN t1.qty * t2.cost ELSE 0 END) id2,
SUM(CASE WHEN t2.opcode = '[id3]' THEN t1.qty * t2.cost ELSE 0 END) id3,
FROM
part_table as p
INNER JOIN table1 AS t1 ON t1.part_key = p.part_key
INNER JOIN table2 AS t2 ON t2.id = t1.id
WHERE
p.part_status = 'Prod'
GROUP BY
p.part_key,
p.q1DATA1,
p.q1DATA2
NB:这是标准的ANSI SQL,适用于大多数RDBMS。