Sql Microsoft Query中的不相同项之和

Sql Microsoft Query中的不相同项之和,sql,oracle,alias,ms-query,microsoft-query,Sql,Oracle,Alias,Ms Query,Microsoft Query,我有一个查询,返回的数据有点像这样: REF01 10 50 1 REF01 10 50 1 REF01 20 40 1 REF01 20 40 1 REF01 30 30 2 REF02 40 20 1 REF02 50 10 2 REF02 50 10 2 REF01 60 120 REF02 90 30 REF01 10 50 1 REF01 20 40 1 REF01 30 30 2

我有一个查询,返回的数据有点像这样:

REF01   10  50  1
REF01   10  50  1
REF01   20  40  1
REF01   20  40  1
REF01   30  30  2
REF02   40  20  1
REF02   50  10  2
REF02   50  10  2
REF01   60  120
REF02   90  30
REF01   10  50  1
REF01   20  40  1
REF01   30  30  2
REF02   40  20  1
REF02   50  10  2
我需要它像这样返回:

REF01   10  50  1
REF01   10  50  1
REF01   20  40  1
REF01   20  40  1
REF01   30  30  2
REF02   40  20  1
REF02   50  10  2
REF02   50  10  2
REF01   60  120
REF02   90  30
REF01   10  50  1
REF01   20  40  1
REF01   30  30  2
REF02   40  20  1
REF02   50  10  2
为此,首先,我添加了一个独特的GROUP BY,其中包含所有列,似乎也会执行相同的操作来删除重复项,其返回结果如下:

REF01   10  50  1
REF01   10  50  1
REF01   20  40  1
REF01   20  40  1
REF01   30  30  2
REF02   40  20  1
REF02   50  10  2
REF02   50  10  2
REF01   60  120
REF02   90  30
REF01   10  50  1
REF01   20  40  1
REF01   30  30  2
REF02   40  20  1
REF02   50  10  2
然后我需要在不计算被移除的重复结果的情况下,将结果相加

我尝试过这样的解决方案,但我从选择中得到一个错误。。。除了子查询中的一列是导致错误ORA-00972的操作列_1-column_2-column_3的结果之外,这项操作确实有效:标识符太长,无法超过30个字符的最大限制,并且无法尝试在子查询中应用别名AS,子查询AS。。。根据我的尝试,在MS Query中不起作用

对大多数SQL函数的支持,这在Microsoft Query上不是最好的。

编辑-这是有效的解决方案:

这个问题似乎与自动生成的列名有关,这对于oracle来说太长了。为了避免此问题,查询可以显式命名CTE列,如下所示:

with
x (col1, col2, col3, col4) as ( -- columns are named here
  select distinct col1, col2, col3, col4 from t
)
select col1, sum(col2), sum(col3)
from x
group by col1
在工具中不起作用的解决方案2:

如果您使用的工具不支持子查询,您仍然可以通过创建视图来欺骗它。例如:

create view view1 as select distinct col1, col2, col3, col4 from t
然后,只需运行使用它的查询:

select col1, sum(col2), sum(col3) from view1 group by col1
结果:

COL1   SUM(COL2)  SUM(COL3)
-----  ---------  ---------
REF02         90         30
REF01         60        120
解决方案3在该工具中也不起作用:

用于测试的数据:

作为参考,我使用的数据脚本是:

create table t (
  col1 varchar2(10),
  col2 number(6),
  col3 number(6),
  col4 number(6)
);

insert into t (col1, col2, col3, col4) values ('REF01', 10, 50, 1);
insert into t (col1, col2, col3, col4) values ('REF01', 10, 50, 1);
insert into t (col1, col2, col3, col4) values ('REF01', 20, 40, 1);
insert into t (col1, col2, col3, col4) values ('REF01', 20, 40, 1);
insert into t (col1, col2, col3, col4) values ('REF01', 30, 30, 1);
insert into t (col1, col2, col3, col4) values ('REF02', 40, 20, 1);
insert into t (col1, col2, col3, col4) values ('REF02', 50, 10, 1);
insert into t (col1, col2, col3, col4) values ('REF02', 50, 10, 1);
编辑-这是有效的解决方案:

这个问题似乎与自动生成的列名有关,这对于oracle来说太长了。为了避免此问题,查询可以显式命名CTE列,如下所示:

with
x (col1, col2, col3, col4) as ( -- columns are named here
  select distinct col1, col2, col3, col4 from t
)
select col1, sum(col2), sum(col3)
from x
group by col1
在工具中不起作用的解决方案2:

如果您使用的工具不支持子查询,您仍然可以通过创建视图来欺骗它。例如:

create view view1 as select distinct col1, col2, col3, col4 from t
然后,只需运行使用它的查询:

select col1, sum(col2), sum(col3) from view1 group by col1
结果:

COL1   SUM(COL2)  SUM(COL3)
-----  ---------  ---------
REF02         90         30
REF01         60        120
解决方案3在该工具中也不起作用:

用于测试的数据:

作为参考,我使用的数据脚本是:

create table t (
  col1 varchar2(10),
  col2 number(6),
  col3 number(6),
  col4 number(6)
);

insert into t (col1, col2, col3, col4) values ('REF01', 10, 50, 1);
insert into t (col1, col2, col3, col4) values ('REF01', 10, 50, 1);
insert into t (col1, col2, col3, col4) values ('REF01', 20, 40, 1);
insert into t (col1, col2, col3, col4) values ('REF01', 20, 40, 1);
insert into t (col1, col2, col3, col4) values ('REF01', 30, 30, 1);
insert into t (col1, col2, col3, col4) values ('REF02', 40, 20, 1);
insert into t (col1, col2, col3, col4) values ('REF02', 50, 10, 1);
insert into t (col1, col2, col3, col4) values ('REF02', 50, 10, 1);

看起来很明显,但这不起作用吗

 select col1, sum(col2) as col2, sum(col3)  as col3 from 
(Select col1, col2, sum(DISTINCT col3) as col3 from t
group by col1, col2) aa
group by col1
或具有以下特征:

WITH tt as (Select col1, col2, sum(DISTINCT col3) as col3 from t
group by col1, col2) 

select col1, sum(col2) as col2, sum(col3)  as col3 from tt
group by col1

看起来很明显,但这不起作用吗

 select col1, sum(col2) as col2, sum(col3)  as col3 from 
(Select col1, col2, sum(DISTINCT col3) as col3 from t
group by col1, col2) aa
group by col1
或具有以下特征:

WITH tt as (Select col1, col2, sum(DISTINCT col3) as col3 from t
group by col1, col2) 

select col1, sum(col2) as col2, sum(col3)  as col3 from tt
group by col1

当我尝试这样做时,我得到一个错误,说明无法将数据添加到表中。它必须是您用于创建查询的工具。为了生成所需的结果,您必须需要一个子查询。如果您正在使用的工具不允许使用它们,则说明您运气不好。我正在使用Microsoft Query,因为我需要将其与Microsoft Excel一起使用。它确实允许子查询,至少使用WITH subquery_name作为子查询方法,但这样我遇到了问题中描述的问题。回到您最初的解决方案,Oracle抱怨CTE的[自动]生成的列名太长。但这些都是可配置的。例如:使用x col1、col2、col3、col4作为。也许您的工具确实有一个选项来指定它们。只是一个问题。当我尝试这样做时,我得到了一个错误,说明无法添加表。它必须是用于创建查询的工具。为了生成所需的结果,您必须需要一个子查询。如果您正在使用的工具不允许使用它们,则说明您运气不好。我正在使用Microsoft Query,因为我需要将其与Microsoft Excel一起使用。它确实允许子查询,至少使用WITH subquery_name作为子查询方法,但这样我遇到了问题中描述的问题。回到您最初的解决方案,Oracle抱怨CTE的[自动]生成的列名太长。但这些都是可配置的。例如:使用x col1、col2、col3、col4作为。也许您的工具确实有一个选项来指定它们。只是一个想法。我认为这将产生一个不同的结果。使用SUMDISTINCT列名称的解决方案似乎有效。我将对它进行更多的测试,看看它是否获得了正确的数据。我认为这将产生不同的结果。使用sumdinct column_name的解决方案似乎有效。我将对它进行更多的测试,看看它是否获得了正确的数据。