2012-04-16 15 views
5

मैं डेटा डेटाSQL क्वेरी कॉलम

S_Acc_RowID BU_Customer_Segment  PBU 

1111-00  PSG SMB  -1 
1111-00  SMB   -1 
1111-00  EB Seg   1 
1111-01  PSG SMB  1 
1111-01  SMB   -1 
1111-01  EB data  -1 
1111-02  PSG Seg  -1 
1111-02  Unattended -1 
1111-02  Channels  -1 

के निम्नलिखित प्रकार के साथ एक डेटाबेस तालिका है के लिए वांछित मूल्यों के साथ डेटा की एक पंक्ति को पुनः प्राप्त करने ---------- ------ तरह 7 लाख पंक्तियों

अब मैं हर एसीसी आईडी जहां स्थिति

1) if the **Acc ID** is having 'EB --' in **CustSeg** then select that **CustSeg** value 
2) if **Acc Id** is not having any 'EB -- ' in CustSeg then select **CustSeg** where **PBU** = 1 
3) if the both above failed take any one value of the **CustSeg** 

हैं के लिए एकल पंक्ति निकालना चाहते हैंऔर अंत डेटा मैं चाहता हूँ

S_Acc_RowID BU_Customer_Segment 

    1111-00  EB seg 
    1111-01  EB Data 
    1111-02  (any one of three[PSG seg/ UNattended/channels]) 

जैसे मैं निम्न क्वेरी

select 
distinct(A.[S_Acc_RowID]) as [Account_RowID], 
[EB Customer Segment] = 
case 
    when LEFT(A.[BU_Customer_Segment],2) = 'EB' then A.[BU_Customer_Segment] 
    when LEFT(A.[BU_Customer_Segment],2) != 'EB' then 
      (select B.[BU_Customer_Segment] from 
       dbo.[SiebelAccount Extract] B 
       where A.[S_Acc_RowID]=B.[S_Acc_RowID] 
       and [PBU] = 1) 
else A.[BU_Customer_Segment] 
end, 
A.[S_Acc_AMID2#] as [AMID Level 2(Acc)], 
A.[S_Acc_Login_P] as [Sales Team(Acc)], 
A.[S_Acc_Org_P] as [Country_det], 
A.[Customer AMID Level 2 Name(ACC)] 

from dbo.[SiebelAccount Extract] A 

उपयोग कर रहा हूँ होना चाहिए लेकिन यह इस

S_Acc_RowID BU_Customer_Segment 

    1111-00  EB seg 
    1111-01  PSG SMB 
    1111-01  EB Data 
    1111-02  null 

की तरह डेटा लौटा रहा है मैं आईडी 1111-01 के लिए दो पंक्तियां प्रदर्शित नहीं करना चाहता हूं .. मुझे ईबीके साथ केवल एक पंक्ति चाहिए

कृपया मुझे इस के साथ मदद ..

अग्रिम धन्यवाद ..

चीयर्स,
हरीश

उत्तर

6

ओरेकल पर, मैं करने की कोशिश की निम्नलिखित और यह काम करना चाहिए अगर आप ओरेकल कन्वर्ट विशिष्ट विश्लेषणात्मक कार्यों, मैंने एक बेहतर उदाहरण के लिए नमूना डेटा में कुछ बदलाव किए हैं:

WITH t AS (
    SELECT '1111-00' AS acc_id, 'PSG SMB' AS cust_seg, -1 AS pbu FROM dual UNION ALL 
    SELECT '1111-00' AS acc_id, 'SMB'  AS cust_seg, -1 AS pbu FROM dual UNION ALL 
    SELECT '1111-00' AS acc_id, 'EB Seg' AS cust_seg, 1 AS pbu FROM dual UNION ALL 
    SELECT '1111-01' AS acc_id, 'PSG SMB' AS cust_seg, 1 AS pbu FROM dual UNION ALL 
    SELECT '1111-01' AS acc_id, 'SMB'  AS cust_seg, -1 AS pbu FROM dual UNION ALL 
    SELECT '1111-01' AS acc_id, 'Ex data' AS cust_seg, -1 AS pbu FROM dual UNION ALL 
    SELECT '1111-02' AS acc_id, 'PSG Seg' AS cust_seg, -1 AS pbu FROM dual UNION ALL 
    SELECT '1111-02' AS acc_id, 'Unatten' AS cust_seg, -1 AS pbu FROM dual UNION ALL 
    SELECT '1111-02' AS acc_id, 'Channels'AS cust_seg, -1 AS pbu FROM dual) 
    -- 
    SELECT acc_id, 
      cust_seg 
     FROM (SELECT t.*, 
        row_number() OVER(PARTITION BY acc_id ORDER BY CASE WHEN cust_seg LIKE '%EB%' THEN 1 WHEN pbu = 1 THEN 2 ELSE 3 END) rnk 
       FROM t 
      ORDER BY acc_id, CASE WHEN cust_seg LIKE '%EB%' THEN 1 WHEN pbu = 1 THEN 2 ELSE 3 END) 
    WHERE rnk = 1 ; 

Result : 

    ACC_ID    CUST_SEG 
    --------------------- ------------------------ 
    1111-00    EB Seg 
    1111-01    PSG SMB 
    1111-02    PSG Seg 

एसक्यूएल सर्वर संस्करण

SELECT * 
    FROM (
       SELECT * 
         , rn = ROW_NUMBER() OVER (PARTITION BY S_Acc_RowID ORDER BY CASE WHEN LEFT(a.BU_Customer_Segment, 2) = 'EB' THEN 1 WHEN a.PBU = 1 THEN 2 ELSE 3 END)   
       FROM [SiebelAccount Extract] a 
      ) q 
    WHERE rn = 1 

और testdata

;WITH [SiebelAccount Extract] (S_Acc_RowID, BU_Customer_Segment, PBU) AS (
    SELECT * FROM (VALUES 
    ('1111-00', 'PSG SMB', -1) 
    , ('1111-00', 'SMB',  -1) 
    , ('1111-00', 'EB Seg', 1) 
    , ('1111-01', 'PSG SMB', 1) 
    , ('1111-01', 'SMB',  -1) 
    , ('1111-01', 'EB data', -1) 
    , ('1111-02', 'PSG Seg', -1) 
    , ('1111-02', 'Unattended', -1) 
    , ('1111-02', 'Channels', -1) 
) a (b, c, d) 
) 
SELECT * 
FROM (
      SELECT * 
        , rn = ROW_NUMBER() OVER (PARTITION BY S_Acc_RowID ORDER BY CASE WHEN LEFT(a.BU_Customer_Segment, 2) = 'EB' THEN 1 WHEN a.PBU = 1 THEN 2 ELSE 3 END)   
      FROM [SiebelAccount Extract] a 
     ) q 
WHERE rn = 1 
+0

+1 एसक्यूएल सर्वर लगभग एक ही व्यवहार करती है। मेरे पास एक कामकाजी, लगभग समान क्वेरी है लेकिन आपने मुझे एक मिनट तक पीटा है :)। –

+0

हाय, उत्तर के लिए धन्यवाद। लेकिन मुझे 1111-01 के परिणामस्वरूप 'ईबी%' के रूप में परिणाम चाहिए, न कि पीएसजी एक .. और मेरे पास मेरी मेज में 7 मिलियन पंक्तियां भी हैं, इसलिए मैं इसे तेजी से निष्पादित करने के लिए एक सरल क्वेरी रखना चाहता हूं .. – harry

+0

धन्यवाद Lieven =) – mcha