2012-04-16 27 views
5

Tôi có một bảng cơ sở dữ liệu với các loại dữ liệu sau đây dữ liệutruy vấn SQL để lấy dòng duy nhất của dữ liệu với giá trị mong muốn cho các cột

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 

---------- ------ như 7 triệu hàng

bây giờ tôi muốn trích xuất hàng duy nhất cho mỗi ID Acc nơi điều kiện

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

và các dữ liệu cuối tôi muốn nên giống như

S_Acc_RowID BU_Customer_Segment 

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

Tôi đang sử dụng các truy vấn sau đây

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 

Nhưng nó được trả lại dữ liệu như thế này

S_Acc_RowID BU_Customer_Segment 

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

Tôi không muốn hiển thị hai hàng cho ID 1111-01 .. Tôi chỉ muốn một hàng có EB

hãy giúp tôi với điều này ..

Thanks in advance ..

Chúc mừng,
Harish

Trả lời

6

On Oracle, tôi đã cố gắng sau và nó sẽ có tác dụng nếu bạn chuyển đổi các oracle chức năng phân tích cụ thể, tôi cũng đã thực hiện một số thay đổi trong dữ liệu mẫu để có ví dụ tốt hơn:

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 phiên bản

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 

và 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 cư xử gần như giống nhau. Tôi có một truy vấn gần như giống hệt nhau nhưng bạn đã đánh bại tôi một phút :). –

+0

Xin chào, Cảm ơn bạn đã trả lời. Nhưng tôi muốn kết quả cho 1111-01 như 'EB%', không phải là PSG một .. Và tôi cũng có 7 triệu hàng trong bảng của tôi, vì vậy tôi đang nghĩ để có một truy vấn đơn giản để thực hiện nó nhanh chóng .. – harry

+0

Cảm ơn Lieven =) – mcha

Các vấn đề liên quan