通过选择具有空值的列进行分组-MySQL

时间:2018-10-11 03:20:57

标签: mysql

我正在处理查询,想对行进行分组并返回分组的数据,但是我的查询无法按预期工作。

我的查询-

select item, branch, packunit,packlevel,dealqty,PromotionFlag,PromotionID, PromotionEndDate, cnc,delivery, volumedeal, standard_price_scheme,
deliv_price_scheme
from 
(
SELECT 
        `item` AS `item`,
        `branch` AS `branch`,
        `PackUnit` AS `PackUnit`,
        `PackLevel` AS `PackLevel`,
        `DealQty` AS `DealQty`,
        `PromotionFlag` AS `PromotionFlag`,
        `PromotionID` AS `PromotionID`,
        `PromotionEndDate` AS `PromotionEndDate`,
        SUM(`cnc`) AS `cnc`,
        SUM(`delivery`) AS `delivery`,
        SUM(`volumedeal`) AS `volumedeal`,
        `standard_price_scheme` AS `standard_price_scheme`,
        `deliv_price_scheme` AS `deliv_price_scheme`
    FROM
    (
SELECT DISTINCT
        `Pricing_Today`.`item` AS `item`,
        `Pricing_Today`.`branch` AS `branch`,
        `Pricing_Today`.`price_scheme` AS `price_scheme`,
        `Pricing_Today`.`PackUnit` AS `PackUnit`,
        `Pricing_Today`.`PackLevel` AS `PackLevel`,
        `Pricing_Today`.`DealQty` AS `DealQty`,
        `Pricing_Today`.`PromotionFlag` AS `PromotionFlag`,
        `Pricing_Today`.`PromotionID` AS `PromotionID`,
        `Pricing_Today`.`PromotionEndDate` AS `PromotionEndDate`,
        (CASE
            WHEN (`Pricing_Today`.`PriceType` = 'C&C') THEN `Pricing_Today`.`Sell`
        END) AS `cnc`,
        (CASE
            WHEN (`Pricing_Today`.`PriceType` = 'Delivery') THEN `Pricing_Today`.`Sell`
        END) AS `delivery`,
        (CASE
            WHEN (`Pricing_Today`.`PriceType` = 'Volume Deal') THEN `Pricing_Today`.`Sell`
        END) AS `volumedeal`,
        (CASE
            WHEN (`Pricing_Today`.`PriceType` = 'C&C') THEN `Pricing_Today`.`price_scheme`
        END) AS `standard_price_scheme`,
        (CASE
            WHEN
                ((`Pricing_Today`.`PriceType` = 'Delivery')
                    OR (`Pricing_Today`.`PriceType` = 'Volume Deal'))
            THEN
                `Pricing_Today`.`price_scheme`
        END) AS `deliv_price_scheme`
    FROM
        `Pricing_Today`
        where item = 78867
        and branch = 0
    GROUP BY `Pricing_Today`.`item` , `Pricing_Today`.`PackUnit` , `Pricing_Today`.`PriceType`,`standard_price_scheme`,`deliv_price_scheme`
    ) as a

    GROUP BY branch,`item` , `PackUnit`,`standard_price_scheme`,`deliv_price_scheme`
    ) as a
    -- group by item, packunit

返回-

enter image description here

但是,当我按项目分组时,我得到了这个-

enter image description here

对于cnc,其显示为空值。如何消除空值并获取数字?

预先感谢

1 个答案:

答案 0 :(得分:1)

您需要汇总CASE表达式:

SELECT
    p.item,
    p.branch,
    p.price_scheme,
    p.PackUnit,
    p.PackLevel,
    p.DealQty,
    p.PromotionFlag,
    p.PromotionID,
    p.PromotionEndDate,
    MAX(CASE WHEN p.PriceType = 'C&C'         THEN p.Sell END) AS cnc,
    MAX(CASE WHEN p.PriceType = 'Delivery'    THEN p.Sell END) AS delivery,
    MAX(CASE WHEN p.PriceType = 'Volume Deal' THEN p.Sell END) AS volumedeal,
    MAX(CASE WHEN p.PriceType = 'C&C' THEN p.price_scheme END) AS standard_price_scheme,
    MAX(CASE WHEN p.PriceType = 'Delivery' OR p.PriceType = 'Volume Deal'
             THEN p.price_scheme END) AS deliv_price_scheme
FROM
    Pricing_Today p
WHERE
    item = 78867 AND branch = 0
GROUP BY
    p.item,
    p.branch,
    p.price_scheme,
    p.PackUnit,
    p.PackLevel,
    p.DealQty,
    p.PromotionFlag,
    p.PromotionID,
    p.PromotionEndDate;

这只是一个标准的数据透视查询。取MAX表达式的CASE的想法是,如果给定的记录组具有单个非NULL值,则MAX将正确地提取它。之所以有效,是因为MAX忽略了NULL的值。

请注意,我从查询中删除了反引号,没有必要。除非确实需要反引号,否则我尽量避免使用反引号,因为它会使查询更难以阅读。