2012-04-16 12 views
5

ho una tabella del database con il seguente tipo di dati di datiquery SQL per recuperare la singola riga di dati con i valori desiderati per le colonne

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 

---------- ------ come 7 milioni di righe

ora voglio estrarre singola riga per ogni ID Acc dove le condizioni sono

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** 

ei dati fine voglio dovrebbe essere come

S_Acc_RowID BU_Customer_Segment 

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

Sto utilizzando la seguente query

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 

Ma è restituire i dati in questo modo

S_Acc_RowID BU_Customer_Segment 

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

Non voglio visualizzare due righe per l'ID 1111-01 .. Voglio una sola riga con EB

please help me con questo ..

Grazie in anticipo ..

Acclamazioni,
Harish

risposta

6

su Oracle, ho provato quanto segue e dovrebbe funzionare se si converte l'oracolo specifiche funzioni analitiche, ho anche apportato alcune modifiche ai dati di esempio per un esempio migliore:

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 

SQL Server versione

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 

e 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 SQL Server si comporta quasi lo stesso. Ho una query funzionante, quasi identica, ma mi hai battuto di un minuto :). –

+0

Ciao, grazie per la risposta. Ma voglio il risultato per 1111-01 come 'EB%', non come PSG .. E ho anche 7 milioni di righe nella mia tabella, quindi penso di avere una semplice query per eseguirlo velocemente .. – harry

+0

Grazie Lieven =) – mcha

Problemi correlati