我有多行包含以下列:
col1
col2
col3
col4
我想说的是,如果col3等于col1等于'a111'的其他行的col2,那么将col3等于col1等于'a111'的其他行的col2的行求和,然后将sum列重命名为“总计”。
具有四列四行的示例表:
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方面没有最丰富的知识。请提出任何问题,我会尽力回答。
答案 0 :(得分:0)
如果没有示例数据和所需数据的示例,那么您的逻辑就很复杂并且难以遵循。但是将伪代码转换为sql可以得到:
声明 var1 =从表1中选择col2,其中col1 ='[table2.col2 value]';
在我的查询中被称为“查找”
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联接。我跟着你的伪代码
答案 1 :(得分:0)
这听起来像是分层查询可以处理的事情。例如。像这样:
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
答案 2 :(得分:0)
没关系。我相信我已经确定了答案。我过度复杂了我想要的东西。还是谢谢你。
答案:
Select Sum(col4) as "Total" from table1 where col3 in (Select col2 from table1 where col1='a111')