繁体   English   中英

使用SQL GROUP BY但仍需要所有值(不仅是MAX值)

[英]Using SQL GROUP BY but still need all values (not just MAX value)

我正在尝试获取多个结果,但是将一个结果分组并给出某些类别的总体计数。 当我尝试执行SQL GROUP BY时,我只能获得MAX值。 我需要每个设备的总订购数量。

Desktops - 2
Laptops  - 5

MSSQL查询:

SELECT 
    m.SDDOCO as salesorder, 
    MAX(m.SDPA8) as customerid, 
    MAX(m.SDNXTR) as status, 
    MAX(m.SDSRP1) as device, 
    MAX(m.SDUORG) as orderqty, 
    MAX(a.ABALPH) as customername,
    MAX(d.DEDATE02) as shipbydate,
    CASE WHEN MAX(m.SDSRP1)='DES' THEN MAX(m.SDUORG) ELSE 0 END AS desktops,
    CASE WHEN MAX(m.SDSRP1)='NTB' THEN MAX(m.SDUORG) ELSE 0 END AS notebooks,
    CASE WHEN MAX(m.SDSRP1)='MON' THEN MAX(m.SDUORG) ELSE 0 END AS monitors
FROM $JDE_F4211 m, $JDE_F554211 d, $JDE_F0101 a 
WHERE 
    d.DEDOCO=m.SDDOCO AND 
    d.DEDCTO=m.SDDCTO AND 
    d.DEKCOO=m.SDKCOO AND 
    d.DELNID=m.SDLNID AND 
    m.SDPA8=a.ABAN8 AND 
    LTRIM(RTRIM(m.SDDCTO)) = 'SO' AND 
    (LTRIM(RTRIM(m.SDLNTY)) = 'WC' OR 
    LTRIM(RTRIM(m.SDLNTY)) = 'S') AND
    LTRIM(RTRIM(m.SDMCU)) <> 'RLG' AND 
    m.SDNXTR<980
GROUP BY m.SDDOCO 
ORDER BY m.SDDOCO DESC

不分组的SQL结果:

[0] => Array
        (
            [salesorder] => 3238404
            [customerid] => 142578
            [status] => 530
            [device] => NTB
            [orderqty] => 5
            [customername] => CUSTOMER1         
            [shipbydate] => 0
        )

[1] => Array
        (
            [salesorder] => 3238404
            [customerid] => 142578
            [status] => 530
            [device] => DES
            [orderqty] => 2
            [customername] => CUSTOMER1         
            [shipbydate] => 0
        )

SQL GROUP BY输出:

[0] => Array
        (
            [salesorder] => 3238404
            [customerid] => 142578
            [status] => 530
            [device] => NTB
            [orderqty] => 5
            [customername] => CUSTOMER1        
            [shipbydate] => 0
            [desktops] => 0.0
            [notebooks] => 5
            [monitors] => 0.0
        )

这就是我希望输出显示的方式: 在此处输入图片说明

我认为这是您的意图:

SELECT m.SDDOCO as salesorder, 
       MAX(m.SDPA8) as customerid, 
       MAX(m.SDNXTR) as status, 
       MAX(m.SDSRP1) as device, 
       MAX(m.SDUORG) as orderqty, 
       MAX(a.ABALPH) as customername,
       MAX(d.DEDATE02) as shipbydate,
       SUM(CASE WHEN m.SDSRP1 = 'DES' THEN m.SDUORG ELSE 0 END) AS desktops,
       SUM(CASE WHEN m.SDSRP1 = 'NTB' THEN m.SDUORG ELSE 0 END) AS notebooks,
       SUM(CASE WHEN m.SDSRP1 = 'MON' THEN m.SDUORG ELSE 0 END) AS monitors
FROM $JDE_F4211 m JOIN
     $JDE_F554211 d
     ON d.DEDOCO = m.SDDOCO AND 
        d.DEDCTO = m.SDDCTO AND 
        d.DEKCOO = m.SDKCOO AND 
        d.DELNID = m.SDLNID JOIN
     $JDE_F0101 a 
     ON m.SDPA8=a.ABAN8
WHERE LTRIM(RTRIM(m.SDDCTO)) = 'SO' AND 
      (LTRIM(RTRIM(m.SDLNTY)) = 'WC' OR 
       LTRIM(RTRIM(m.SDLNTY)) = 'S'
      ) AND
      LTRIM(RTRIM(m.SDMCU)) <> 'RLG' AND 
     m.SDNXTR < 980
GROUP BY m.SDDOCO 
ORDER BY m.SDDOCO DESC;

一个忠告: 不要FROM子句中使用逗号。 始终使用明确的,正确的JOIN语法。

对于与非数量相关的字段,您实际上没有想要的输出。 使用条件求和而不是MAX可以帮助您计算组数。 试试这个为您的选择条款

SELECT 
m.SDDOCO as salesorder, 
MAX(m.SDPA8) as customerid, 
MAX(m.SDNXTR) as status, 
MAX(m.SDSRP1) as device, 
SUM(m.SDUORG) as orderqty, 
MAX(a.ABALPH) as customername,
MAX(d.DEDATE02) as shipbydate,
SUM(CASE WHEN m.SDSRP1 ='DES' THEN m.SDUORG ELSE 0 END) AS desktops,
SUM(CASE WHEN m.SDSRP1 ='NTB' THEN m.SDUORG ELSE 0 END) AS notebooks,
SUM(CASE WHEN m.SDSRP1 ='MON' THEN m.SDUORG ELSE 0 END) AS monitors

尝试为每个设备作为子查询运行,然后在销售订单和任何其他必要字段上将结果结合在一起。 这将为您提供所需的单行输出。 下面的简化版本:

Select a.salesorder, a.desktops, b.notebooks, c.monitors
FROM
(SELECT 
    m.SDDOCO as salesorder,  
    MAX(m.SDUORG) as desktops
FROM Table m
WHERE m.SDSRP1 = 'DES'
GROUP BY m.SDDOCO) a
INNER JOIN
(SELECT 
    m.SDDOCO as salesorder,  
    MAX(m.SDUORG) as notebooks
FROM Table m
WHERE m.SDSRP1 = 'NTB'
GROUP BY m.SDDOCO) b
on a.salesorder = b.salesorder
INNER JOIN
(SELECT 
    m.SDDOCO as salesorder,  
    MAX(m.SDUORG) as monitors
FROM Table m
WHERE m.SDSRP1 = 'MON'
GROUP BY m.SDDOCO) c
on a.salesorder = c.salesorder

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM