简体   繁体   中英

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

I'm trying to grab multiple results but group to one result and give overall counts on certain categories. When I do the SQL GROUP BY with my attempts I can only get the MAX value. I need the total orderqty of each device.

Desktops - 2
Laptops  - 5

MSSQL Query:

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 results without grouping:

[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 output:

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

This is how I wish my output would show: 在此处输入图片说明

I think this is what you intend:

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;

A piece of advice: Never use commas in the FROM clause. Always use explicit, proper JOIN syntax.

You don't really have your desired output in the question for the non-quantity related fields. Using Sum with conditions instead of MAX should help you for your group counts. try this for your select clause

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

Try running as a subquery for each device and then joining the results together on the salesorder and any other necessary fields. This should give you the one line output you seek. Simplified version below:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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