2017-02-24 21 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