GROUP BY HAVING 的用法SQL


SELECT t1.REPRESENT_SKU_CODE --
 ,t1.DELIVERY_TYPE_NO --
 ,t1.SHIPPING_LOCATION --
 ,MAX(t3.SHIPPING_WAREHOUSE_CODE) --
 FROM COMMODITY_HEADER t1
INNER JOIN STOCK t2
ON t2.SKU_CODE = t1.REPRESENT_SKU_CODE
INNER JOIN ALLOCATION_ORDER_MANAGEMENT t3
ON t3.WAREHOUSE_CODE = t2.WAREHOUSE_CODE
WHERE t1.SINGLE_DELIVERY_FLG = '0'
GROUP BY t1.REPRESENT_SKU_CODE, t1.DELIVERY_TYPE_NO, t1.SHIPPING_LOCATION
HAVING COUNT(*) > 1;

数据是这样子的,想把REPRESENT_SKU_CODE DELIVERY_TYPE_NO SHIPPING_LOCATION一样,SHIPPING_WAREHOUSE_CODE不一样的数据抽出来,如果是REPRESENT_SKU_CODE DELIVERY_TYPE_NO SHIPPING_LOCATION,SHIPPING_WAREHOUSE_CODE 四个字段都一样的话,就不抽出来。为什么不好用呢。

img

为啥不直接用这四个字段一起分组呢?

【以下回答由 GPT 生成】

解决方案

根据问题描述,你想要从数据库中抽取出REPRESENT_SKU_CODE、DELIVERY_TYPE_NO和SHIPPING_LOCATION相同,但SHIPPING_WAREHOUSE_CODE不同的数据,同时排除同时具有相同REPRESENT_SKU_CODE、DELIVERY_TYPE_NO、SHIPPING_LOCATION和SHIPPING_WAREHOUSE_CODE的数据。

目前的查询语句使用了GROUP BY和HAVING语句,但无法达到你想要的效果。可能的原因是HAVING COUNT(*) > 1的条件过于宽松,导致无法正确排除具有相同REPRESENT_SKU_CODE、DELIVERY_TYPE_NO、SHIPPING_LOCATION和SHIPPING_WAREHOUSE_CODE的数据。

为了解决这个问题,可以使用子查询和EXISTS子句来进行优化。以下是优化后的查询语句:

SELECT t1.REPRESENT_SKU_CODE, t1.DELIVERY_TYPE_NO, t1.SHIPPING_LOCATION, t3.SHIPPING_WAREHOUSE_CODE
FROM COMMODITY_HEADER t1
INNER JOIN STOCK t2 ON t2.SKU_CODE = t1.REPRESENT_SKU_CODE
INNER JOIN ALLOCATION_ORDER_MANAGEMENT t3 ON t3.WAREHOUSE_CODE = t2.WAREHOUSE_CODE
WHERE t1.SINGLE_DELIVERY_FLG = '0'
AND EXISTS (
    SELECT 1
    FROM COMMODITY_HEADER t4
    INNER JOIN STOCK t5 ON t5.SKU_CODE = t4.REPRESENT_SKU_CODE
    INNER JOIN ALLOCATION_ORDER_MANAGEMENT t6 ON t6.WAREHOUSE_CODE = t5.WAREHOUSE_CODE
    WHERE t1.REPRESENT_SKU_CODE = t4.REPRESENT_SKU_CODE
    AND t1.DELIVERY_TYPE_NO = t4.DELIVERY_TYPE_NO
    AND t1.SHIPPING_LOCATION = t4.SHIPPING_LOCATION
    AND t3.SHIPPING_WAREHOUSE_CODE != t6.SHIPPING_WAREHOUSE_CODE
)
GROUP BY t1.REPRESENT_SKU_CODE, t1.DELIVERY_TYPE_NO, t1.SHIPPING_LOCATION, t3.SHIPPING_WAREHOUSE_CODE;

这个优化方案中,我们使用了一个子查询来判断是否存在具有相同REPRESENT_SKU_CODE、DELIVERY_TYPE_NO和SHIPPING_LOCATION,但SHIPPING_WAREHOUSE_CODE不同的数据。如果存在这样的数据,则将其包括在最终的查询结果中。

这种优化方案可以解决你的问题,同时还可以提高查询的性能。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^