2017-03-09 69 views
0

我有兩個位置表:具有兩個表的聯合的列的SQL SUM不正確

1)一個表將列出其中包含一部分的所有位置。所以,一行將有LOCA PARTB QTY 5,另一行將有LOCA PARTC QTY2,另一行可能是LOCB PARTX QTY3。因此,當一行的QTY = 0時,它將被刪除。因此,有其中一個位置將不再在此表中列出的實例

LOCQTYS表:

Location | Part |QTY 
LOCA  | PARTB | QTY 5 
LOCA  | PARTC | QTY2 
LOCB  | PARTX | QTY3 

2)我還有一個表,其中列出的存在,無論位置所有的名字,如果有一個部分分配給它或不分配零件。

此表只列出名稱和描述。

LOCNames表:

LocName | Description 
LOCA | Storage 
LOCA | Storage 
LOCB | Base 

所以我試圖列出用戶和顯示0的所有位置,如果沒有部件被分配或顯示指定的所有部分的總和。

example: 
Loc1 30 
Loc2 12 
Loc3 0 
Loc4 6 

我的SQL語句如下:

sql = @"SELECT locnam, 
      Sum(locqty) 
      FROM (SELECT locnam, 
          locqty 
        FROM " + DatabaseUtility.LibraryList.I + @".locqtys 
        UNION 
        SELECT locdnam AS LOCNAM, 
          '0'  AS LOCQTY 
        FROM " + DatabaseUtility.LibraryList.I + @".locnames) R 
      GROUP BY locnam 
      ORDER BY locnam ASC"; 

的問題是計數是關閉...

So what should be, 
example: 
Loc1 30 
Loc2 12 
Loc3 0 
Loc4 6 

結束是:

example: 
Loc1 25 
Loc2 8 
Loc3 0 
Loc4 3 

的總和低於實際...我做錯了什麼?

回答

3

使用 「UNION ALL」,而不是 「聯盟」 ......聯盟消除重複。

+0

是的,它做到了!沒有考慮到可能存在具有相同位置和數量的不同行......謝謝! – eaglei22

1

你正在尋找一個left join

select l.locnam, coalesce(sum(lp.locqty), 0) as locqty 
from locations l left join 
    locationparts lp 
    on lp.locnam = l.locnam 
group by l.locnam; 
+0

謝謝。我不熟悉coalesce函數。我將不得不玩這個。 – eaglei22

+0

在這種情況下,你可以使用使用合​​並功能或ifnull功能或案例指令 – Esperento57

0

這是你在找什麼? 創建表LOC (位置VARCHAR(10), 部分VARCHAR(10), 數量INT)

插入件插入LOC值 ( '軌跡', '部分',10), ( '軌跡' ,'部分b',20), ('locb','部分c',30), ('locc','part d','')

選擇位置,總和(qty)按位置分組enter image description here

0

in Sql總和始終使用「Isnull(column_name,0.00)」和「union all」

/------------------------/

SELECT isnull(locnam) as locnam, 
Sum(isnull(locqty,0.00) as locqty 
      FROM (SELECT isnull(locnam,0.00) as locnam 
          isnull(locqty,0.00) as locqty) 
        FROM " + DatabaseUtility.LibraryList.I + @".locqtys 
        UNION all 
        SELECT isnull(locdnam,0.00) AS LOCNAM, 
          '0.00'  AS LOCQTY 
        FROM " + DatabaseUtility.LibraryList.I + @".locnames) R 
      GROUP BY locnam 
      ORDER BY locnam ASC