繁体   English   中英

MS SQL中CASE列上的MAX语句出现问题

[英]Issue with MAX statement on CASE column in MS SQL

我无法让下面的查询中的第二个MAX语句按我的意愿工作,以举例说明我目前获得的输出;

PART                    FREE_STOCK      BIN             ME_BIN
01TSC7EM                21.0000         A1E             NULL
01TSC7EM010MLG           7.0000         A1E             NULL
01TSC7EM010MME           7.0000         218             218         
01TSC7EM010MSM           3.0000         407             NULL
01TSC7EM010MXL           4.0000         407             NULL

BIN列的第一个MAX可以按照我期望的方式进行分组,这意味着短部分将获得FREE_STOCK最多的BIN位置,我希望通过使用case语句并遵循类似的逻辑,我也可以返回BIN位置对于以'%ME'结尾的零件,也使用相同的MAX行为将其设置为短零件。

这是因为我使用case语句来提供值,而不是针对列进行操作吗? 关于如何使它起作用的任何建议?

SELECT dbo.part_bins.part, SUM(dbo.part_bins.free_stock) AS FREE_STOCK, MAX(PART_BINS.BIN) AS Bin, 
       MAX(CASE WHEN part_bins.part like '%ME' then PART_BINS.BIN END) AS ME_Bin
FROM   dbo.part_bins 
WHERE  dbo.part_bins.free_stock > 0 
GROUP BY dbo.part_bins.part
UNION
SELECT part.master_part AS part, SUM(dbo.part_bins.free_stock) AS FREE_STOCK,     MAX(PART_BINS.BIN) AS Bin, 
       MAX(CASE WHEN part.master_part like '%ME' THEN PART_BINS.BIN END) AS ME_Bin
FROM   dbo.part_bins 
WHERE  dbo.part_bins.free_stock > 0                   
GROUP BY part.master_part

我希望我能得到的最终结果是:

PART                    FREE_STOCK      BIN             ME_BIN
01TSC7EM                21.0000         A1E             218
01TSC7EM010MLG           7.0000         A1E             NULL
01TSC7EM010MME           7.0000         218             218         
01TSC7EM010MSM           3.0000         407             NULL
01TSC7EM010MXL           4.0000         407             NULL

这不是很漂亮,但这是我的最终解决方案。 我发现我需要在第一个选择中删除MAX CASE语句:

MAX(CASE WHEN part_bins.part like '%ME' then PART_BINS.BIN END) AS ME_Bin

而是将其保留为空白列:

'' AS ME_Bin

这使得part.master_part组可以按照我与第二个SELECT中的MAX CASE语句结合使用的预期进行工作。 其他更改是为了解决男女产品尺寸之间的一些差异,以及考虑是否有可用的免费库存,而这些都与解决方案无关。

SELECT     dbo.part_bins.part, SUM(dbo.part_bins.free_stock) AS FREE_STOCK, MAX(PART_BINS.BIN) AS Bin, '' as ME_bin

FROM         dbo.part_bins LEFT OUTER JOIN
                      dbo.part ON dbo.part_bins.part = dbo.part.part LEFT OUTER JOIN
                      dbo.stor ON dbo.part_bins.store = dbo.stor.store LEFT OUTER JOIN
                      dbo.stor_bdtl ON dbo.part_bins.store = dbo.stor_bdtl.store AND dbo.part_bins.bin = dbo.stor_bdtl.bin
WHERE     (dbo.stor.on_hand = 1) AND (dbo.part_bins.free_stock > 0) AND (dbo.stor.sales = 1) OR
                      (dbo.stor.on_hand = 1) AND (dbo.part_bins.free_stock > 0) AND (dbo.stor.production = 1)
GROUP BY dbo.part_bins.part
UNION
SELECT     part.master_part AS part, SUM(dbo.part_bins.free_stock) AS FREE_STOCK, MAX(PART_BINS.BIN) AS Bin, 
        MAX (case 
            when part.prod_group like 'ME%' AND part_bins.part like '%ME' then part_bins.bin
            when part.prod_group like 'ME%' AND part_bins.part like '%32' then part_bins.bin
            when part.prod_group like 'LA%' AND part_bins.part like '%08' then part_bins.bin
            when part.prod_group like 'LA%' AND part_bins.part like '%XS' then part_bins.bin
        end) as ME_bin

FROM         dbo.part_bins LEFT OUTER JOIN
                      dbo.part ON dbo.part_bins.part = dbo.part.part LEFT OUTER JOIN
                      dbo.stor ON dbo.part_bins.store = dbo.stor.store LEFT OUTER JOIN
                      dbo.stor_bdtl ON dbo.part_bins.store = dbo.stor_bdtl.store AND dbo.part_bins.bin = dbo.stor_bdtl.bin
WHERE     (dbo.stor.on_hand = 1) AND (dbo.part_bins.free_stock > 0) AND (dbo.stor.sales = 1) OR
                      (dbo.stor.on_hand = 1) AND (dbo.part_bins.free_stock > 0) AND (dbo.stor.production = 1)
GROUP BY part.master_part

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM