简体   繁体   English

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

[英]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. 当我尝试执行SQL GROUP BY时,我只能获得MAX值。 I need the total orderqty of each device. 我需要每个设备的总订购数量。

Desktops - 2
Laptops  - 5

MSSQL Query: 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 results without grouping: 不分组的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 output: 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
        )

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. 一个忠告: 不要FROM子句中使用逗号。 Always use explicit, proper JOIN syntax. 始终使用明确的,正确的JOIN语法。

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. 使用条件求和而不是MAX可以帮助您计算组数。 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

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

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