用于添加除了所有行的数据的SQL查询

时间:2013-03-15 09:14:08

标签: sql hive

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

假设我有这样的公司表

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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'

答案 3 :(得分: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;