2013-03-14 78 views
2

我无法在下面的查询中获取第二个MAX语句以按照我的意愿工作,给出我现在得到的输出示例;MS SQL中CASE列的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 

第一MAX为BIN列工作,我与分组的含义是,不足部分得到BIN位置最FREE_STOCK,我希望用一个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 
+1

应该是最终的结果集? – 2013-03-14 10:47:47

+0

你在上面给出的表中想要什么变化? – 2013-03-14 11:04:28

+0

第一个PART以'EM'结尾,而不是'ME'。你过滤ME,所以你不会得到第一部分的结果。 – JodyT 2013-03-14 11:12:12

回答

1

这不是漂亮,但是这是我的最终解决方案。我发现我需要消除在第一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