2017-02-24 23 views
0

我试图抓取多个结果,但将其分组到一个结果并给出某些类别的总体计数。当我用我的企图做SQL GROUP BY时,我只能得到MAX值。我需要每个设备的总订单数量。使用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 
     ) 

这是我多么希望我的输出将显示: enter image description here

回答

3

我想这是你想要什么:

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语法。

+0

作为OP想'每个device'的总orderqty,IMO的'MAX'应更改为'SUM'为'SDUORG' –

+0

@ PhamX.Bach。 。 。我同意。我使用了MAX(),因为这是OP在他/她的查询中所做的。 –

+0

谢谢 - 这完美的作品。顺便说一句..你有一个额外的)在第一个SUM(CASE行前ELSE 0 END ...导致语法错误。 – rubberchicken

1

对于与数量无关的字段,您在问题中确实没有所需的输出。使用总和与条件而不是MAX应该可以帮助您进行小组统计。尝试一下本作SELECT子句

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 
1

尝试运行为每个设备子查询,然后在salesorder和任何其他必要的字段中的结果结合在一起。这应该给你你想要的一行输出。下面的简化版本:

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