2013-02-25 75 views
2

所以我有這樣的SQL代碼,我想顯示其收費單,並在他們收到的每個項目的總和:跨乘法表

select item_description, sum(receipt_qty) as Samp1, sum(chargeSlip_qty) as Samp2 
from Items inner join Receipt_Detail on (Receipt_Detail.item_number = 
    Items.item_number) 
inner join ChargeSlip_Detail on (ChargeSlip_Detail.item_number = 
    Items.item_number) 
group by item_description 

它產生這樣的輸出:

Acetazolamide 2681 1730 
Ascorbic Acid 1512 651 
Paracetamol 1370 742 
Silk   576 952 

但它應該是:

Acetazolamide 383 173 
Ascorbic Acid 216 93 
Paracetamol 274 106 
Silk   96 238 

我的代碼出了什麼問題?

回答

2

由於您正在加入表格,因此當您獲取sum()時,您可能會遇到一對一的關係,從而導致問題。所以你可以使用子查詢來獲得結果。這將得到sum()receiptchargeslip每個item_number,然後你加入該回你items表得到最終的結果是:

select i.item_description, 
    r.Samp1, 
    c.Samp2 
from Items i 
inner join 
(
    select sum(receipt_qty) Samp1, 
    item_number 
    from Receipt_Detail 
    group by item_number 
) r 
    on r.item_number = i.item_number 
inner join 
(
    select sum(chargeSlip_qty) Samp2, 
    item_number 
    from ChargeSlip_Detail 
    group by item_number 
) c 
    on c.item_number = i.item_number 
+0

finnaly解決我的問題:)謝謝先生! – 2013-02-25 14:00:40

0
Item_Number執行分組依據,第一,

,讓你不乘以Receipt_DetailChargeSlip_Detail。也就是說,你加入回Items

select 
    I.item_description, 
    R.Samp1, 
    C.Samp2 
from 
    Items I 
    inner join 
    (SELECT item_number, sum(receipt_qty) as Samp1 
     FROM Receipt_Detail 
     GROUP BY item_number 
    ) R 
     on (R.item_number = I.item_number) 
    inner join 
    (SELECT item_number, sum(chargeSlip_qty) as Samp2 
     FROM ChargeSlip_Detail 
     GROUP BY item_number 
    ) C 
     on (C.item_number = I.item_number) 
0

左前生成每個Item_Number值的總和左表聯接返回行,並在左邊的表的每一行,在右邊的表中的所有匹配的行。

因此,例如:

create table Customers (name varchar(50)); 
insert Customers values 
    ('Tim'), 
    ('John'), 
    ('Spike'); 
create table Orders (customer_name varchar(50), product varchar(50)); 
insert Orders values (
    ('Tim', 'Guitar'), 
    ('John', 'Drums'), 
    ('John', 'Trumpet'); 
create table Addresses (customer_name varchar(50), address varchar(50)); 
insert Addresses values (
    ('Tim', 'Penny Lane 1'), 
    ('John', 'Abbey Road 1'), 
    ('John', 'Abbey Road 2'); 

然後,如果你運行:

select c.name 
,  count(o.product) as Products 
,  count(a.address) as Addresses 
from Customers c 
left join Orders o on o.customer_name = c.name 
left join Addresses a on a.customer_name = c.name 
group by name 

你得到:

name Products Addresses 
Tim  1   1 
John 4   4 
Spike 0   0 

但約翰沒有4級的產品!
如果沒有group by運行,你可以看到爲什麼計數是關閉:

select * 
from Customers c 
left join Orders o on o.customer_name = c.name 
left join Addresses a on a.customer_name = c.name 

你得到:

name customer_name product  customer_name address 
Tim  Tim    Guitar  Tim    Penny Lane 1 
John John   Drums  John   Abbey Road 1 
John John   Drums  John   Abbey Road 2 
John John   Trumpet  John   Abbey Road 1 
John John   Trumpet  John   Abbey Road 2 
Spike NULL   NULL  NULL   NULL 

正如你所看到的,加入最終重複對方。對於每個產品,重複地址列表。這給你錯誤的數字。爲了解決這個問題,使用優秀的其他答案之一:

select c.name 
,  o.order_count 
,  a.address_count 
from Customers c 
left join 
     (
     select customer_name 
     ,  count(*) as order_count 
     from Orders 
     group by 
       customer_name   
     ) o 
on  o.customer_name = c.name 
left join 
     (
     select customer_name 
     ,  count(*) as address_count 
     from Addresses 
     group by 
       customer_name   
     ) a 
on  a.customer_name = c.name 

子查詢確保只有一行每個客戶加入。結果好多了:

name order_count address_count 
Tim  1   1 
John 2   2 
Spike NULL  NULL