【问题标题】:Haven't been able to solve this:一直无法解决这个问题:
【发布时间】:2018-01-29 18:55:29
【问题描述】:

无法解决这个问题,只是不知道出了什么问题:

SELECT    
    CODE, NAME,
    BRANCH, SALESP,
    CASE 
        WHEN SUM(S1) = 0 THEN NULL
        ELSE SUM(S1) 
    END as S1,
    CASE 
       WHEN SUM(V1) = 0 THEN NULL
       ELSE SUM(V1) 
    END as V1,
    CASE 
       WHEN SUM(CHANGE) = 0 THEN NULL
       ELSE SUM(CHANGE) 
    END as CHANGE
FROM 
    SAESQL7_E03.[dbo].[p1]
WHERE   
    S1 <> 0 
    OR CHANGE <> 0
GROUP BY
    CODE, NAME, BRANCH, SALESP

导致:

code  name    branch   salesp   s1   v1   change
-------------------------------------------------
1     Max     A        S        20   10    -5
2     Ben     A                 10    3     5
2     Ben     B                 20    5    10

问题出在第 3 列,如果客户在多个分行,这总是错误的。

(Max 的例子,当客户只在一个分支时,总是正确的;Ben 的例子有两个或多个分支,第一个分支总是正确的,后面的分支总是错误的)

原始表的正确数据是:

   code  name    branch   salesp    S1  V1   V2   change
   ---------------------------------------------------
    1     Max     A        S        20   5   10    -5
    2     Ben     A                 10   8    3     5
    2     Ben     B                 20  10    5     5

CHANGE 栏目来自:

   SUM (V1-V2) AS CHANGE

【问题讨论】:

  • 您在查询中使用了S1 列,但我在您的原始表中看不到该列。
  • 你说事情不对,但不解释原因。向我们展示数据库架构、示例数据、当前和预期输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。 How to create a Minimal, Complete, and Verifiable example
  • “第 3 列”在源表和结果中是“分支”,那么有什么问题?什么是列名,其中包含“错误值”?
  • 我在您的 cmets 之后更正:问题出在最后一行当有重复的客户(相同的代码、名称)但不同的分支时,我得到错误的结果(V2 值被忽略并取为零) 正确结果应该是 5 而不是 10(第三行)
  • 列名错误的是CHANGE

标签: sql group-by sum


【解决方案1】:

据我所知,您的查询是正确的,并且给出了正确的答案!出了点问题;我们会试着找出什么。看起来您是在 Microsoft SQL Server 上运行,所以这是我用于测试的。

这里是源表:

1> select * from p1;
2> go
code  name branch salesp   s1   v1   v2   change
----- ---- ------ ------ ---- ---- ---- --------
    1 Max  A      S        20    5   10       -5
    2 Ben  A      NULL     10    8    3        5
    2 Ben  B      NULL     20   10    5        5

(3 rows affected)

这是您的查询:

1> SELECT
2>     CODE, NAME,
3>     BRANCH, SALESP,
4>     CASE
5>         WHEN SUM(S1) = 0 THEN NULL
6>         ELSE SUM(S1)
7>     END as S1,
8>     CASE
9>        WHEN SUM(V1) = 0 THEN NULL
10>        ELSE SUM(V1)
11>     END as V1,
12>     CASE
13>        WHEN SUM(CHANGE) = 0 THEN NULL
14>        ELSE SUM(CHANGE)
15>     END as CHANGE
16> FROM
17>     p1
18> WHERE
19>     S1 <> 0
20>     OR CHANGE <> 0
21> GROUP BY
22>     CODE, NAME, BRANCH, SALESP
23> ;
24> go

...和结果:

  CODE NAME BRANCH SALESP    S1   V1   CHANGE
------ ---- ------ ------ ----- ---- --------
     1 Max  A      S         20    5       -5
     2 Ben  A      NULL      10    8        5
     2 Ben  B      NULL      20   10        5

(3 rows affected)

所以出了点问题。请您再次尝试从源表中进行选择吗?它是否包含任何其他数据?如果没有,那么 从 SAESQL7_E03.[dbo].[p1] 中选择 * 最好。

如果有更多数据,请执行此操作以确保您包含与上述查询中使用的相同的行:

select    
    code,
    name,
    branch,
    salesp,
    s1,
    v1,
    v2,
    change
from 
    SAESQL7_E03.dbo.p1
where   
    s1 <> 0 
    or change <> 0;

查询中的 V1 似乎从源中的 v2 返回值。这是一个线索吗?尽管您正在聚合,但源数据中的每个组中的值永远不会超过一个。这只是每组 1 行的测试,目的是增加每组的行数吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 2022-06-23
    • 2011-03-20
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多