Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql oracle中跨表的case when语句_Sql_Oracle - Fatal编程技术网

Sql oracle中跨表的case when语句

Sql oracle中跨表的case when语句,sql,oracle,Sql,Oracle,您好,很抱歉格式化,但我感到困惑和沮丧,我只是需要一些帮助 我有两张桌子。我曾真诚地尝试遵循社区标准,但为了以防万一,表a有3列“ID”,用于识别销售代表,“Start”表示他们开始的公司术语,“sales”表示他们在第一个术语中的销售额。表B只是表A的一个扩展,其中列出了销售人员在场的所有条款(我将其标记为季度)及其销售额 表A 它为所有case-when语句提供空值。请帮助也许可以分组尝试 create table a ( id number, strt number, sales numb

您好,很抱歉格式化,但我感到困惑和沮丧,我只是需要一些帮助

我有两张桌子。我曾真诚地尝试遵循社区标准,但为了以防万一,表a有3列“ID”,用于识别销售代表,“Start”表示他们开始的公司术语,“sales”表示他们在第一个术语中的销售额。表B只是表A的一个扩展,其中列出了销售人员在场的所有条款(我将其标记为季度)及其销售额

表A 它为所有case-when语句提供空值。请帮助

也许可以分组尝试

create table a ( id number, strt number, sales number);
create table b (id number, quarter number , sales number);

insert into a values (1,141,30);
insert into a values (2,151,50);
insert into a values (3,151,80);

insert into b values ( 1,141,30);
insert into b values ( 1,142,25);
insert into b values ( 1,143,45);
insert into b values ( 2,151,50);
insert into b values ( 2,152,60);
insert into b values ( 2,153,75);
insert into b values ( 3,151,80);
insert into b values ( 3,152,50);
insert into b values ( 3,153,70);

 select a.id, a.strt, a.sales, 
    max(case when a.strt+1 = b.quarter then b.sales end ) as secondquartersales,
    max(case when a.strt+2 = b.quarter then b.sales end ) as thridquartersales
from  a, b
where  a.id = b.id
group by  a.id, a.strt, a.sales;
或支点

select * from (
select a.id, 
    case when a.strt+1 = b.quarter then 'Q2'  
        when a.strt+2 =  b.quarter then  'Q3'  
        when a.strt+3 =  b.quarter then  'Q4' 
        when a.strt = b.quarter then 'Q1'end  q,
        b.sales sales
    
from  a, b
where  a.id = b.id) 
pivot ( max(nvl(sales,0)) for Q in ('Q1', 'Q2', 'Q3', 'Q4'));
也许可以试试分组

create table a ( id number, strt number, sales number);
create table b (id number, quarter number , sales number);

insert into a values (1,141,30);
insert into a values (2,151,50);
insert into a values (3,151,80);

insert into b values ( 1,141,30);
insert into b values ( 1,142,25);
insert into b values ( 1,143,45);
insert into b values ( 2,151,50);
insert into b values ( 2,152,60);
insert into b values ( 2,153,75);
insert into b values ( 3,151,80);
insert into b values ( 3,152,50);
insert into b values ( 3,153,70);

 select a.id, a.strt, a.sales, 
    max(case when a.strt+1 = b.quarter then b.sales end ) as secondquartersales,
    max(case when a.strt+2 = b.quarter then b.sales end ) as thridquartersales
from  a, b
where  a.id = b.id
group by  a.id, a.strt, a.sales;
或支点

select * from (
select a.id, 
    case when a.strt+1 = b.quarter then 'Q2'  
        when a.strt+2 =  b.quarter then  'Q3'  
        when a.strt+3 =  b.quarter then  'Q4' 
        when a.strt = b.quarter then 'Q1'end  q,
        b.sales sales
    
from  a, b
where  a.id = b.id) 
pivot ( max(nvl(sales,0)) for Q in ('Q1', 'Q2', 'Q3', 'Q4'));


这是有效的ANSI 92 SQL,因为它是一个内部联接。整个ANSI样式版本只是语法糖果。

这是有效的ANSI 92 SQL,因为它是一个内部连接。整个ANSI样式的版本只是语法糖果。

您编写的查询应该会生成错误,因为
sales
不明确,并且
q
未定义。表示b而不是q。漫长的一天。你能以表格形式添加预期结果吗?我的第二个问题是
start
quarter
之间的关系是什么?为什么要添加
start+1
?@Sujitmohanty30,因为启动时间不均匀。我想看看员工在第二季度、第三季度等的销售情况。start+1、start+2等应该给出,至少我希望如此。请不要发布代码或数据的图片-使用格式化文本。谢谢。您编写的查询应该会生成一个错误,因为
sales
不明确且
q
未定义。表示b而不是q。漫长的一天。你能以表格形式添加预期结果吗?我的第二个问题是
start
quarter
之间的关系是什么?为什么要添加
start+1
?@Sujitmohanty30,因为启动时间不均匀。我想看看员工在第二季度、第三季度等的销售情况。start+1、start+2等应该给出,至少我希望如此。请不要发布代码或数据的图片-使用格式化文本。谢谢。这是一个很好的解决方案。但在标准SQL1992中,这种连接语法被显式连接所取代,这甚至比MySQL出现还要早几年。不要使用逗号分隔的连接。我们不再是80年代了。使用a.id=b.id上的内部联接b的
。如果没有帮助,我可以删除。感谢您的帮助@MonikaLewandowska,这对我帮助很大。这里有没有规定只允许使用ANSI SQL?我找不到。。。。你能分享一个链接吗?我对某人改变我的答案感到不高兴。我为此付出了很大的努力,但我不再确定我的答案是否仍然正确和准确。没有这样的规则!这个问题是针对Oracle的,因此使用Oracle语法的答案是合适的。这是一个非常好的解决方案。但在标准SQL1992中,这种连接语法被显式连接所取代,这甚至比MySQL出现还要早几年。不要使用逗号分隔的连接。我们不再是80年代了。使用a.id=b.id上的内部联接b的
。如果没有帮助,我可以删除。感谢您的帮助@MonikaLewandowska,这对我帮助很大。这里有没有规定只允许使用ANSI SQL?我找不到。。。。你能分享一个链接吗?我对某人改变我的答案感到不高兴。我为此付出了很大的努力,但我不再确定我的答案是否仍然正确和准确。没有这样的规则!该问题已标记为Oracle,因此使用Oracle语法的答案是合适的。
select * from (
select a.id, 
    case when a.strt+1 = b.quarter then 'Q2'  
        when a.strt+2 =  b.quarter then  'Q3'  
        when a.strt+3 =  b.quarter then  'Q4' 
        when a.strt = b.quarter then 'Q1'end  q,
        b.sales sales
    
from  a, b
where  a.id = b.id) 
pivot ( max(nvl(sales,0)) for Q in ('Q1', 'Q2', 'Q3', 'Q4'));