2010-07-13 166 views
0

你好家伙需要帮助的查询。请看下面的表格帮助与SQL查询

alt text http://i26.tinypic.com/1ot0d0.jpg

我需要从表中首先选择每个代码的总和。我正在用简单的总和和声明来分组。然后,我必须减去从每个代码总和其中类型=“R”

1)假设查询的第一部分的结果,我们将得到2行从SUM(一个具有总USD和一个用总YEN)

2)现在我需要从这些结果中减去相应的USD,其具有类型=“R”

任何线索人YEN值?我必须在SQL内部而不是存储过程。

回答

1
select code, l.amount - r.amount 
from 
    (select code, sum(amount) as amount from my_table group by code) l 
    left join (select code, sum(amount) as amount from my_table where type = 'r' group by code) r 
    on l.code = r.code 
+0

一个字?真棒:) – 2010-07-15 06:49:48

0

它是否必须是单个查询?

我会说总和总和,然后SUM子类别其中Type ='r',然后减去另一个。

可能在一行SQL中这样做,但我敢肯定它会加入表本身或使用子查询。无论哪种方式,它都在做与上面相同的工作量。

+0

感谢您的回复,是的,它需要在一个单一的查询。我很困惑如何减去子类别相等的地方)。 Duh,我有一个投票下来我的问题:( – 2010-07-13 06:03:39

4

为什么不使用WHERE语句说WHERE Type != 'r'使这些值甚至从来没有被添加在首位总结...

SELECT `Code`, SUM(`Amount`) AS `Total` 
    FROM `Table` 
WHERE `Type` != 'r' 
GROUP 
    BY `Code`; 

类似的东西。

+0

谢谢animuson,很好的一点。这只是一个简单的示例表。在实际的表格和场景中,我必须减少并以某种方式显示结果,需求有点 – 2010-07-13 06:16:54

+1

这似乎是一个很好的解决方案,为什么不添加更多的信息,如果需求有点不同 – mcha 2010-07-13 07:19:29

1

您可以在一个单一的,简单的查询做到这一点:

select 
    code, 
    sum(case when type = 'r' then (-1 * amount) else amount end) as sum 
from 
    yourtable 
group by 
    code 

基本上,你改变具有类型=“R”行的标志,所以当你总结的所有行对于特定的代码,你会得到正确的答案。

+0

这是不正确的,你会得到美元= 1003而不是2003年 – Toto 2010-07-13 08:33:56

0

尝试:

select code, 
     sum(amount) gross_total, 
     sum(case when type = 'r' then amount else 0 end) type_r_total, 
     sum(case when type != 'r' then amount else 0 end) net_total 
from yourtable 
group by code; 

看到每个货币一行每种货币整体总计,R型仅总数和非类型R的总数,在单次通过。