2013-03-18 33 views
0

我正在创建一张发票表,将每个项目分成几年,并使用Toad for Oracle进行查询。在发票上创建数量*价格的适当总和时出现问题

什么我目前做的是使用相同的FROM和WHERE子句作为我的观点(因为这数据来自多个表)

Select DISTINCT 
SUM(Credits * Credit_Price) as "Cost", to_char(START_DATE, 'YYYY') as "YEAR", 
PERSON_ID, ITEM_TYPE 
[...] 
WHERE 
[...] 
to_char(START_DATE, 'YYYY') = '2012' 

当我看到在查看费用我会创造我看到适当的人的成本为0,100和0的条目,

但是如果我做SUM/GROUP BY(按item_type,person_id和to_char(START_DATE,'YYYY')分组),我得到一个成本3860700为同一个人!

关于如何解决这个问题的任何想法,所以我得到100而不是3860700?

编辑︰所以基本上我想要一个数量*成本,但总结它,所以我得到该项目类型的总数(而不是对同一项目有多个行)。

+0

如果删除了 “DISTINCT” 你还得到3行:0,100,0?或者你有更多的行? – joelt 2013-03-18 14:15:48

+0

如果我切换到我的视图(这是相同减去SUM/GROUP BY语句),并删除DISTINCT我得到很多(超过2K)行看起来... 如果我从SUM查询中删除差异我仍然当然只是得到一个。 – James 2013-03-18 14:18:18

+1

独特可能是隐藏了一个连接中的错误 - 没有看到您的代码,很难提供帮助。 – 2013-03-18 14:27:33

回答

0

在SQL SELECT distinct sum()将不会归纳不同的值,所以你需要先选择不同的值,然后总结起来:

Select 
SUM(Credits * Credit_Price) as "Cost", to_char(START_DATE, 'YYYY') as "YEAR", 
PERSON_ID, ITEM_TYPE 
[...] 
from (select DISTINCT Credits , Credit_Price, START_DATE,PERSON_ID, ITEM_TYPE 
[...]) 
WHERE 
[...] 
to_char(START_DATE, 'YYYY') = '2012' 

或把不同的这样的总和内:

Select 
SUM(DISTINCT Credits * Credit_Price) as "Cost", to_char(START_DATE, 'YYYY') as "YEAR", 
PERSON_ID, ITEM_TYPE 
[...] 
WHERE 
[...] 
to_char(START_DATE, 'YYYY') = '2012' 

请注意,2个选项不是平等的,你想总结不同的积分,Credit_Price 或独特的Credits * Credit_Price?

See sqlfiddle example

+0

啊,这是有道理的,sqlfiddle的例子很有帮助谢谢! 嗯,好,每一行都有单笔交易的信用和信用价格,我想为所有交易加起来的成本......想不到我想要哪一个。 – James 2013-03-18 14:36:55

+0

我似乎已经找到了你的帮助,并做了更多的测试,非常感谢! – James 2013-03-18 14:40:49