避风港能够解决这个问题:

时间:2018-01-29 18:55:29

标签: sql group-by sum

无法解决这个问题,并且无法想知道出了什么问题:

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&#39; s示例,当客户只在一个分支机构时,总是正确; 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

1 个答案:

答案 0 :(得分:0)

据我所知,您的查询是正确的并给出了正确的答案!出了点问题;我们会试着找出什么。它看起来像是在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行,是为了增加每组的行数吗?