[英]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.