2017-03-09 75 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