1

我正在寻找一个对除一个之外的所有行执行求和运算的查询。通过下面的例子会更清楚..

假设我有一张这样的公司表

Company_name     Rev      order
  c1             100      1000
  c2             200      2000
  c3             300      1500

现在查询应该插入到表中,如下所述:

 c1(rev)      c1(order)     sum of other(rev)          other(order)
  100          1000        500(sum of c2 and c3)      3500(sum of c2 and c3's order)

这种情况的查询是什么?

我在想一个查询:

insert into table_name (c1_rev,c1_order,sum_rev,sum_order) 
select rev, order, sum(rev), sum(order) where Company_name=c1 ....

但我被卡住了,因为我找不到其他两个的总和。

4

4 回答 4

0

在 Hive 中,查询类似于:

select sq.cnn,sum(rev),sum(orders) from 
(select if(cn=='c1','c1','other') as cnn, rev,orders from test_cn) sq
group by sq.cnn;

将生成 2 行:

c1      100     1000
other   500     3500

与您的输出不完全匹配,但可以以您需要的形式提取。

要进行测试,请使用以下内容创建一个文本文件:

% cat test_cn
c1|100|1000
c2|200|2000
c3|300|3000

在蜂巢中:

hive> drop table if exists test_cn;
hive> create table test_cn (cn string, rev int, orders int) row format delimited fields terminated by '|' stored as textfile;
hive> select sq.cnn,sum(rev),sum(orders) from (select if(cn=='c1','c1','other') as cnn, rev,orders from test_cn)sq group by sq.cnn;
于 2013-03-18T15:58:39.297 回答
0

在 SQL Server 中,您可以执行以下操作来获取数据:

WITH totals AS
(SELECT SUM(rev) revSum, SUM(ORDER_) orderSum 
   FROM T)
SELECT company_name, 
       rev, 
       order_, 
       totals.revsum - rev AS otherRev, 
       totals.orderSum - order_ AS otherOrder
FROM  t, totals
于 2013-03-15T09:24:13.557 回答
0

试试这个查询:

SELECT Company_name ,
  Rev ,
  ORDER,
  (SELECT SUM(Rev ) FROM table_name k WHERE k.Company_name<>t.Company_name
  )"sum of other(rev)",
  (SELECT SUM(order ) FROM table_name k WHERE k.Company_name<>t.Company_name
  )"other(order)"
FROM table_name t
于 2013-03-15T09:30:42.503 回答
0

没有 Group By 将是最好的解决方案,但 HIVE 目前不支持它,试试这个:

insert into table table_name 
select rev, order,  sumRev,  sumOrd 
from (
    select Company_name,rev, order, sum(rev)-rev as sumRev, sum(order) - order as sumOrd from base_table 
) a
where Company_name='c1'
于 2013-03-15T14:20:31.260 回答