如何将变量用作select语句,然后对变量中的多个值求和



我有多行,其中包含以下列:

col1
col2
col3
col4

我想说的是,如果col3等于col2的行是col1等于"a111"的其他行,那么对col3等于col2的行的col4求和,然后将sum列重命名为"Total"。

四列四行示例表:

col1 col2 col3 col4
---- ---- ---- ----
a222 a333 4444
a111 a333
a555 a444 1111
a111 a444

我试过以下方法,但不起作用。

Declare
var1 = Select col2 from table1 where col1='a111';
var2 = Select col3 from table1 where col3=var1;
var3 = Select col4 from table1 where col3=var1;
Begin
If var2=var1
Then Select SUM(var3) As "Total";
End

预期结果为:

Total
5555

我在总体编程或Oracle方面没有最强的知识。请提出任何问题,我会尽力回答。

如果没有现有数据的示例和所需数据的示例,您的逻辑是复杂的,很难遵循。。但是将您的伪代码转换为sql会产生:

声明var1=从表1中选择col2,其中col1='[table2.col2 value]';

在我的查询中调用"find">

var2=从表1中选择col3,其中col3=var1;var3=从表1中选择col4,其中col3=var1;

通过将表连接回"查找"实现

开始如果var2=var1然后选择SUM(var3(作为"总计";结束

仅在"ifpart"中var1=var2的行上使用var3的和实现

SELECT SUM(var3) FROM
(
SELECT alsot1.col3 as var2, alsot1.col4 as var3
FROM
table1 alsot1
INNER JOIN
(
SELECT t1.col2 as var1
FROM table1 t1 INNER JOIN table2 t2 ON t1.col1 = t2.col2
) find
ON find.var1 = alsot1.col3
) ifpart
WHERE
var1 = var2

这可以简化,但我这样呈现是因为它符合您对问题的理解。查询优化器无论如何都会在运行它的时候重写它,所以只有在性能较差的情况下才有可能开始打乱它的执行方式

顺便说一句,您明确表示两个表通过一个名为col2的公共表连接,但您随后在伪代码中表示表在col1=col2上连接。我跟踪了你的伪代码

这听起来像是分层查询可以处理的问题。例如:

WITH your_table AS (SELECT NULL col1, 'a222' col2, 'a333' col3, 4444 col4 FROM dual UNION ALL
SELECT 'a111' col1, 'a333' col2, NULL col3, NULL col4 FROM dual UNION ALL
SELECT NULL col1, 'a555' col2, 'a444' col3, 1111 col4 FROM dual UNION ALL
SELECT 'a111' col1, 'a444' col2, NULL col3, NULL col4 FROM dual UNION ALL
SELECT 'a666' col1, 'a888' col2, NULL col3, NULL col4 FROM dual UNION ALL
SELECT NULL col1, 'a777' col2, 'a888' col3, 7777 col4 FROM dual)
SELECT col1,
SUM(col4) col4_total
FROM   (SELECT connect_by_root(col1) col1,
col4
FROM   your_table
CONNECT BY col3 = PRIOR col2
START WITH col1 IS NOT NULL) -- start with col1 = 'a111')
GROUP BY col1;
COL1 COL4_TOTAL
---- ----------
a666       7777
a111       5555

永不终止。我相信我自己已经决定了答案。我把我想要的东西弄得太复杂了。无论如何,谢谢你。

答案:

Select Sum(col4) as "Total" from table1 where col3 in (Select col2 from table1 where col1='a111')

最新更新