【问题标题】:SQL SUM of a column with the union of two tables is incorrect具有两个表并集的列的 SQL SUM 不正确
【发布时间】:2017-03-09 22:47:34
【问题描述】:

我有两个位置表:

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

总和低于实际...我做错了什么?

【问题讨论】:

    标签: c# sql sum db2 union


    【解决方案1】:

    使用“UNION ALL”而不是“UNION”...联合消除重复项。

    【讨论】:

    • 是的,做到了!没有考虑到可能有不同的行具有相同的位置和数量...谢谢!
    【解决方案2】:

    您正在寻找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;
    

    【讨论】:

    • 谢谢。我不熟悉合并功能。我将不得不玩这个。
    • 在这种情况下,您可以使用 use coalesce 函数或 ifnull 函数或 case 指令
    【解决方案3】:

    这就是你要找的吗??? 创建表位置 (位置 varchar(10), 部分 varchar(10), 数量 int)

    插入 loc 值 ('local','part a', 10), ('local','part b', 20), ('locb','c 部分', 30), ('locc','part d', '')

    select location, sum(qty) from loc group by location

    【讨论】:

      【解决方案4】:

      在 Sql Sums 中始终使用“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
      

      【讨论】:

        猜你喜欢
        • 2018-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多