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