0

我有两张桌子;SalesData 和 AllOffers。

SalesData 表有 Brand(永远不能为 null)、Product type(可以为 null)、Lot(永远不能为 null)、Size of product(永远不能为 null)、Stage(永远不能为 null)、Province(将为 null)如果 Stage = "WIP")、Packed On Date(永远不能为 null)和 Quantity(永远不能为 null)。

AllOffers 表有 Province(永远不能为 null)、Offer number(永远不能为 null)、Product Type(可以为 null)、Brand(永远不能为 null)、Product Size(永远不能为 null)、Lot(永远不能为null)、Packed on date(永远不能为 null)、Quantity(永远不能为 null)和 Offer Status(永远不能为 null)。

我有一个带有两个窗格的应用程序。在左侧窗格中,用户根据 SalesData 中可用的批次创建“报价”,右侧窗格显示带有附加“可用数量”列的 SalesData 表,该列在用户创建报价时动态计算。

数据需要按省、阶段、产品类型、尺寸和包装日期分组,以提供可用数量。由于省和产品类型中的空值,我无法对数据进行分组。

这就是我所拥有的

SELECT
        SalesData.Province,
        SalesData.Stage,
        SalesData.ProdType,
        SalesData.Brand, 
        SalesData.Size,
        SalesData.Lot,
        SalesData.PackedOn,
        SalesData.Qty, 
        CAST(SalesData.Qty AS decimal(12, 0)) - CAST(AllOffersSub.Qty AS decimal(12, 0)) AS Available 
    FROM
        SalesData LEFT OUTER JOIN 
        (
            SELECT
                    Province,
                    Brand,
                    Stage,
                    Lot,
                    Size,
                    PackedOn,
                    ProdType, 
                    SUM(CAST(Quantity AS decimal(12, 0))) AS Qty
                FROM
                    AllOffers
                WHERE
                    (OfferStatus = 'Unconfirmed')
                OR  (OfferStatus = 'Confirmed')
                GROUP BY
                    Province,
                    Brand,
                    Stage,
                    Lot,
                    Size,
                    PackedOn,
                    ProdType
        ) AS AllOffersSub ON
        AllOffersSub.Brand = SalesData.Brand
    AND AllOffersSub.Lot = SalesData.Lot
    AND AllOffersSub.Size = SalesData.Size
    AND AllOffersSub.PackedOn = SalesData.PackedOn
    AND AllOffersSub.Stage= SalesData.Stage
    AND CASE
            WHEN SalesData.Province IS NULL THEN 1 
            WHEN AllOfferssub.Province = SalesData.Province THEN 1 
            ELSE 0 END =1 
    AND CASE 
            WHEN SalesData.ProdType IS NULL AND AllOffersSub.ProdType IS NULL THEN 1 
            WHEN AllOfferssub.ProdType = SalesData.ProdType THEN 1  
            ELSE 0  
        END = 1;

问题是很多可以显示为 WIP(正在进行的工作,这意味着省=Null)和 FG(完成好,这意味着省不会为空)。对于这样的批次,没有进行分组,我最终得到了一批具有相同包装日期、阶段、产品类型、尺寸的批次,显示的次数与该批次相关的订单数量一样多。

有没有办法根据标准进行选择性分组?例如,如果 stage = "WIP",则按阶段、产品类型、尺寸和包装日期分组,否则按阶段、产品类型、尺寸和包装日期分组?

这是 Offer 表的示例:

ID|Customer|OfferNum|Stage|ProdType|Brand|Size|Lot|PackedOn|Quantity|Status
1 |A       | A1     |WIP  | Null   |test |Tst |aaa|1/1/2020|100     |Confirmed
2 |B       | B1     |WIP  | Null   |test |Tst |aaa|1/1/2020|100     |Unconfirmed
3 |C       | C1     |WIP  | Null   |test |Tst |aaa|1/1/2020|100     |Unconfirmed
4 |C       | C1     |FG   | Null   |test |Tst |aaa|1/1/2020|100     |Unconfirmed

这是 SalesData 表的示例:

ID|Brand|ProdType|Lot|Size|Stage|Customer|PackedOn|Qty
1 |test | Null   |aaa|Tst |WIP  |Null    |1/1/2020|1000
2 |test | Null   |aaa|Tst |FG   |C       |1/1/2020|1000

查询的结果是:

Customer|Stage|ProdType|Brand|Size|Lot|PackedOn|Qty |Available
Null    |WIP  | Null   |test |Tst |aaa|1/1/2020|1000|900
Null    |WIP  | Null   |test |Tst |aaa|1/1/2020|1000|900
Null    |WIP  | Null   |test |Tst |aaa|1/1/2020|1000|900
C       |FG   | Null   |test |Tst |aaa|1/1/2020|1000|900

结果应该是:

Customer|Stage|ProdType|Brand|Size|Lot|PackedOn|Qty |Available
Null    |WIP  | Null   |test |Tst |aaa|1/1/2020|1000|700
C       |FG   | Null   |test |Tst |aaa|1/1/2020|1000|900
4

1 回答 1

1

我对您的查询进行了一些更改,但关键是您需要将province子查询更改为

iif(stage = 'wip', null, province)

为避免在 select 语句和 group 子句中重复代码,我将其放入一个名为ap并从中选择的交叉应用语句中。

除此之外,我只是将您的子查询放入一个公共表表达式中,将您的on子句中的 case 语句转换为or语句,并重新设置样式。

with modifiedOffers as (

    select      ap.Province, 
                Brand, Stage, Lot, Size, PackedOn, ProdType, 
                Qty = sum(cast(Quantity as decimal(12, 0))) 
    from        @allOffers o
    cross apply (select Province = iif(stage = 'wip', null, province)) ap
    where       o.Status in ('Unconfirmed', 'Confirmed')
    group by    ap.Province, Brand, Stage, Lot, Size, PackedOn, ProdType

)

select      sd.Province, sd.Stage, sd.ProdType, sd.Brand, sd.Size, sd.Lot, sd.PackedOn, sd.Qty, 
            Available = CAST(sd.Qty AS decimal(12, 0)) - o.Qty 
from        @salesData sd
left join   modifiedOffers o  
                on o.Brand = sd.Brand
                and o.Lot = sd.Lot
                and o.Size = sd.Size
                and o.PackedOn = sd.PackedOn
                and o.Stage = sd.Stage
                and (o.Province = sd.Province or sd.Province is null)
                and (o.ProdType = sd.ProdType or sd.ProdType is null and o.ProdType is null);
于 2020-03-03T15:09:32.013 回答