2012-11-09 54 views
1

第1栏:组合2分的SQL查询内部计算的列

(CASE 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'General' THEN 'G' 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'Honors' THEN 'H' 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'WhosWho' THEN 'Y' 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'Catholic' THEN 'J' 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'Conservative' THEN 'B' 
      ELSE 'H' 
     END)      AS Edition 

第2栏:

(SELECT edition 
     FROM clients.dbo.service 
     WHERE serv_id = hdr.serv_id) AS editiontext, 
     (CASE 
      WHEN hdr.giftcarddiscount = 1 THEN 'GCDisc' 
      ELSE (CASE 
        WHEN si.itmclass = 'Distrib' THEN '-Disc' 
        WHEN si.itmclass = 'PremIR' THEN '0' + '-Disc' 
        WHEN si.itmclass = 'InstResp' THEN '5' + '-Disc' 
        ELSE '' 
        END) 
     END)      AS 'ItemCode' 

我需要既版和ItemCode在第三塔相结合。 -Disc(ItemCode)应该像G-Disc一样,但是0-Disc(ItemCode)应该变成0G-Disc。

我需要选择为

选择版,ItemCode,版+ ItemCode ....

我已经使用以下命令来创建第三列,但好奇,如果这可以以更好的方式来完成。 ..

(CASE 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'General' THEN (
      CASE 
      WHEN hdr.giftcarddiscount = 1 THEN 'GCDisc' 
      ELSE(CASE 
        WHEN si.itmclass = 'Distrib' THEN 'G-Disc' 
        WHEN si.itmclass = 'PremIR' THEN '0G' + '-Disc' 
        WHEN si.itmclass = 'InstResp' THEN '5G' + '-Disc' 
        ELSE '' 
        END) 
      END) 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'Honors' THEN (
      CASE 
      WHEN hdr.giftcarddiscount = 1 THEN 'GCDisc' 
      ELSE(CASE 
        WHEN si.itmclass = 'Distrib' THEN 'H-Disc' 
        WHEN si.itmclass = 'PremIR' THEN '0H' + '-Disc' 
        WHEN si.itmclass = 'InstResp' THEN '5H' + '-Disc' 
        ELSE '' 
        END) 
      END) 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'WhosWho' THEN (
      CASE 
      WHEN hdr.giftcarddiscount = 1 THEN 'GCDisc' 
      ELSE(CASE 
        WHEN si.itmclass = 'Distrib' THEN 'Y-Disc' 
        WHEN si.itmclass = 'PremIR' THEN '0Y' + '-Disc' 
        WHEN si.itmclass = 'InstResp' THEN '5Y' + '-Disc' 
        ELSE '' 
        END) 
      END) 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'Catholic' THEN (
      CASE 
      WHEN hdr.giftcarddiscount = 1 THEN 'GCDisc' 
      ELSE(CASE 
        WHEN si.itmclass = 'Distrib' THEN 'J-Disc' 
        WHEN si.itmclass = 'PremIR' THEN '0J' + '-Disc' 
        WHEN si.itmclass = 'InstResp' THEN '5J' + '-Disc' 
        ELSE '' 
        END) 
      END) 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'Conservative' THEN (
      CASE 
      WHEN hdr.giftcarddiscount = 1 THEN 'GCDisc' 
      ELSE(CASE 
        WHEN si.itmclass = 'Distrib' THEN 'B-Disc' 
        WHEN si.itmclass = 'PremIR' THEN '0B' + '-Disc' 
        WHEN si.itmclass = 'InstResp' THEN '5B' + '-Disc' 
        ELSE '' 
        END) 
      END) 
      ELSE (CASE 
        WHEN hdr.giftcarddiscount = 1 THEN 'GCDisc' 
        ELSE(CASE 
          WHEN si.itmclass = 'Distrib' THEN 'H-Disc' 
          WHEN si.itmclass = 'PremIR' THEN '0H' + '-Disc' 
          WHEN si.itmclass = 'InstResp' THEN '5H' + '-Disc' 
          ELSE '' 
          END) 
        END) 
     END)      AS EditionItemCode 

回答

1

您的case语句中有多个冗余子查询,我不认为需要在那里。如果我理解你的表格和查询是正确的,那么你应该能够做到以下几点。注意我已经将第一个case语句(Edition列)提取到派生表连接中,然后从第二个case语句中引用它以创建EditionItemCode

SELECT s.edition AS editiontext, s.e AS edition, 
    CASE 
     WHEN hdr.giftcarddiscount = 1 THEN 'GCDisc' 
     WHEN si.itmclass = 'Distrib' THEN '-Disc' 
     WHEN si.itmclass = 'PremIR' THEN '0-Disc' 
     WHEN si.itmclass = 'InstResp' THEN '5-Disc' 
     ELSE '' 
    END AS ItemCode, 
    CASE 
     WHEN hdr.giftcarddiscount = 1 THEN 'GCDisc' 
     WHEN si.itmclass = 'Distrib' THEN s.e + '-Disc' 
     WHEN si.itmclass = 'PremIR' THEN '0' + s.e + '-Disc' 
     WHEN si.itmclass = 'InstResp' THEN '5' + s.e + '-Disc' 
     ELSE '' 
    END AS EditionItemCode 
FROM hdr 
LEFT OUTER JOIN 
(
    SELECT serv_id, CASE edition 
       WHEN 'General' THEN 'G' 
       WHEN 'Honors' THEN 'H' 
       WHEN 'WhosWho' THEN 'Y' 
       WHEN 'Catholic' THEN 'J' 
       WHEN 'Conservative' THEN 'B' 
       ELSE 'H' 
      END AS e, edition 
    FROM clients.dbo.service 
) s ON s.serv_id = hdr.serv_id 
JOIN si ON ... 
+0

感谢您的输入,我将您的解决方案替换为我的查询,并且效果很好。 –

1

最好的办法是将您的查询视为子查询,并使用父查询从该子查询中选择值。所以:

select Edition, ItemCode, ItemCode+Edition as ItemCodeEdition 
from 
(select (CASE 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'General' THEN 'G' 
      WHEN (SELECT edition 
       FROM clients.dbwo.service 
       WHERE serv_id = hdr.serv_id) = 'Honors' THEN 'H' 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'WhosWho' THEN 'Y' 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'Catholic' THEN 'J' 
      WHEN (SELECT edition 
       FROM clients.dbo.service 
       WHERE serv_id = hdr.serv_id) = 'Conservative' THEN 'B' 
      ELSE 'H' 
     END)      AS Edition, 

(SELECT edition 
     FROM clients.dbo.service 
     WHERE serv_id = hdr.serv_id) AS editiontext, 
     (CASE 
      WHEN hdr.giftcarddiscount = 1 THEN 'GCDisc' 
      ELSE (CASE 
        WHEN si.itmclass = 'Distrib' THEN '-Disc' 
        WHEN si.itmclass = 'PremIR' THEN '0' + '-Disc' 
        WHEN si.itmclass = 'InstResp' THEN '5' + '-Disc' 
        ELSE '' 
        END) 
     END)      AS 'ItemCode') as tempTable 
+0

感谢您的输入,我最终使用了lc的解决方案。 –