Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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
Oracle SQL:通过行的间隙_Sql_Oracle - Fatal编程技术网

Oracle SQL:通过行的间隙

Oracle SQL:通过行的间隙,sql,oracle,Sql,Oracle,我有一个有一些列的表和一个有月份的表。我有一个字段U_VATX至少1个月的行,我想为错过的月份带来与其他列完全相同的值的数据,除了那些总和为零的列 我想重写SQL,以消除行之间的间隙,并显示缺少月份信息的行 以下是我的SQL,它只适用于一个U_VATX: 可以使用左外连接。以下是基于您的示例。“bla”部分可能需要修改以满足您的需要。希望这有帮助 create table demo ( cola varchar2(10), colb varchar2(10), colc varcha

我有一个有一些列的表和一个有月份的表。我有一个字段U_VATX至少1个月的行,我想为错过的月份带来与其他列完全相同的值的数据,除了那些总和为零的列

我想重写SQL,以消除行之间的间隙,并显示缺少月份信息的行

以下是我的SQL,它只适用于一个U_VATX:


可以使用左外连接。以下是基于您的示例。“bla”部分可能需要修改以满足您的需要。希望这有帮助

create table demo (
  cola varchar2(10),
  colb varchar2(10),
  colc varchar2(10),
  colmonth varchar2(2),
  colsum1 number,
  colsum2 number
);

insert into demo values ('bla','bla','bla','01',35,48);
insert into demo values ('bla','bla','bla','03',22,41);

select * from demo;

select 
  nvl(demo.cola, 'bla'),
  nvl(demo.colb, 'bla'),
  nvl(demo.colc, 'bla'),
  nvl(demo.colmonth, a.colmonth),
  nvl(demo.colsum1, 0),
  nvl(demo.colsum2, 0)
from (select '01' as colmonth from dual
      union
      select '02' as colmonth from dual
      union
      select '03' as colmonth from dual) a
left outer join demo on a.colmonth = demo.colmonth
order by 1;
根据表格的大小,“bla”部分可以按如下方式处理

with bla as
(select distinct 
        cola, colb, colc,
        '00' as colmonth,
        0 as colsum1,
        0 as colsum2
 from demo
 group by cola, colb, colc),
mth as
(select '01' as colmonth from dual
 union
 select '02' as colmonth from dual
 union
 select '03' as colmonth from dual),
blamth as
(select bla.cola, bla.colb, bla.colc,
        mth.colmonth, bla.colsum1, bla.colsum2
 from bla, mth)
select 
  nvl(demo.cola, blamth.cola),
  nvl(demo.colb, blamth.colb),
  nvl(demo.colc, blamth.colc),
  nvl(demo.colmonth, blamth.colmonth),
  nvl(demo.colsum1, 0),
  nvl(demo.colsum2, 0)
from demo right outer join blamth
on demo.colmonth = blamth.colmonth
order by 1;
您可以在这里查看:

基于“colx”和“sumcolsum”要求的新解决方案


新的SQL FIDLE:Oracle SQL允许使用分区外部联接填充稀疏数据


这里有11.2的记录,但我赢了;由于其复杂性,请不要尝试在特定代码上实现它。

请给我们一个简单易懂的查询。我有下表:a、b、c、MONTH、sum1、sum2,其值为:bla、bla、bla、'01',35,48、bla、bla、bla、bla、'03',22,41等等。我还想显示缺少'02'月份的行,如bla,bla,bla,'02',0,0。您的代码很棒,部分修复了我的需要。我忘了说我有一个列,说colx,在这列colx之后,它重复了我之前在帖子中所说的-对于colx的值,我们有bla1,bla2,bla3,'01',32,48,bla1,bla2,bla3,'05',55,87,对于colx的另一个值,我们有bla4,bla5,bla6,'02',33,65,bla4,bla5,bla6,'03',25,31等等。现在我看到你的第一个解决方案和我的一样,当然,是有效的。但是对于我之前在colx专栏文章中所说的,你有解决方案吗?我在上面基于“colx”要求添加了一个新的解决方案。希望这对您有用。修复了我示例中的数据。我已更新了上面的查询以处理新的sumcolsum要求。关于Pa Wa提供的解决方案,我还需要在下面的fiddle中放置两列带和的列:。我需要为每个colx和month填充已经填充到零的相同总和。
with bla as
(select distinct 
        cola, colb, colc,
        '00' as colmonth,
        0 as colsum1,
        0 as colsum2
 from demo
 group by cola, colb, colc),
mth as
(select '01' as colmonth from dual
 union
 select '02' as colmonth from dual
 union
 select '03' as colmonth from dual),
blamth as
(select bla.cola, bla.colb, bla.colc,
        mth.colmonth, bla.colsum1, bla.colsum2
 from bla, mth)
select 
  nvl(demo.cola, blamth.cola),
  nvl(demo.colb, blamth.colb),
  nvl(demo.colc, blamth.colc),
  nvl(demo.colmonth, blamth.colmonth),
  nvl(demo.colsum1, 0),
  nvl(demo.colsum2, 0)
from demo right outer join blamth
on demo.colmonth = blamth.colmonth
order by 1;
with bla as
(select distinct colx, cola, colb, colc
 from demo),
mth as
(select '01' as colmonth from dual
 union
 select '02' as colmonth from dual
 union
 select '03' as colmonth from dual
 union
 select '04' as colmonth from dual
 union
 select '05' as colmonth from dual),
blamth as
(select bla.colx, bla.cola, bla.colb, bla.colc,
        mth.colmonth
 from bla, mth),
allcols as
(select 
  nvl(demo.colx, blamth.colx) as colx,
  nvl(demo.cola, blamth.cola) as cola,
  nvl(demo.colb, blamth.colb) as colb,
  nvl(demo.colc, blamth.colc) as colc,
  nvl(demo.colmonth, blamth.colmonth) as colmonth,
  nvl(demo.colsum1, 0) as colsum1,
  nvl(demo.colsum2, 0) as colsum2
from demo right outer join blamth
on demo.colx = blamth.colx and
   demo.colmonth = blamth.colmonth)
select allcols.colx,
       allcols.cola,
       allcols.colb,
       allcols.colc,
       allcols.colmonth,
       allcols.colsum1,
       allcols.colsum2,
       (select sum(nvl(ai.colsum1,0))
        from   allcols ai
        where  ai.colx = allcols.colx
          and  ai.cola = allcols.cola
          and  ai.colb = allcols.colb
          and  ai.colc = allcols.colc) as sumcolsum1,
       (select sum(nvl(ai.colsum2,0))
        from   allcols ai
        where  ai.colx = allcols.colx
          and  ai.cola = allcols.cola
          and  ai.colb = allcols.colb
          and  ai.colc = allcols.colc) as sumcolsum2
from allcols
order by 1, 5;