2013-02-26 38 views
4

準備sql查詢問題。使用分區計算所有狀態和特定狀態的數量

CREATE TABLE right_data(RID NUMBER(9,0), STATUS NUMBER(2,0)); 
CREATE TABLE left_data(LID NUMBER(9,0), URL VARCHAR(70 BYTE)); 
CREATE TABLE left_to_right(LID NUMBER(9,0), RID NUMBER(9,0)); 

INSERT INTO right_data (RID, STATUS) VALUES (1,0); 
INSERT INTO right_data (RID, STATUS) VALUES (2,1); 
INSERT INTO right_data (RID, STATUS) VALUES (3,0); 
INSERT INTO right_data (RID, STATUS) VALUES (4,0); 
INSERT INTO right_data (RID, STATUS) VALUES (5,1); 

INSERT INTO left_data (LID, URL) VALUES (1,'data_1'); 
INSERT INTO left_data (LID, URL) VALUES (2,'data_2'); 
INSERT INTO left_data (LID, URL) VALUES (3,'data_3'); 
INSERT INTO left_data (LID, URL) VALUES (4,'data_4'); 
INSERT INTO left_data (LID, URL) VALUES (5,'data_5'); 

INSERT INTO left_to_right (LID, RID) VALUES (1,1); 
INSERT INTO left_to_right (LID, RID) VALUES (1,2); 
INSERT INTO left_to_right (LID, RID) VALUES (2,1); 
INSERT INTO left_to_right (LID, RID) VALUES (1,4); 
INSERT INTO left_to_right (LID, RID) VALUES (4,3); 
INSERT INTO left_to_right (LID, RID) VALUES (5,1); 
INSERT INTO left_to_right (LID, RID) VALUES (3,5); 
INSERT INTO left_to_right (LID, RID) VALUES (4,2); 

錯誤的查詢。

SELECT 
    DISTINCT left_to_right.LID 
    , COUNT(left_to_right.RID) OVER (PARTITION BY left_to_right.LID) AS NUM_RID 
    , COUNT(left_to_right.RID) OVER (PARTITION BY 
             left_to_right.LID 
            AND 
             right_data.STATUS = 1 
           ) AS NUM_RID_S1 
FROM 
    left_to_right 
    JOIN 
    right_data 
    ON 
    right_data.RID = left_to_right.RID 
ORDER BY left_to_right.LID; 

我怎麼能在同一查詢LID /(數均right_data.status)和LID數/(right_data.status數爲1)?

回答

4

如果我理解正確的話,這應該這樣做:

SELECT left_to_right.LID, 
     COUNT(DISTINCT left_to_right.RID) all_right_data_statuses, 
     COUNT(DISTINCT CASE WHEN right_data.STATUS = 1 THEN left_to_right.RID 
         ELSE NULL END) right_data_status_1 
FROM 
    left_to_right 
    JOIN 
    right_data 
    ON 
    right_data.RID = left_to_right.RID 
GROUP BY left_to_right.LID 

Here is a demo給你試用。

1

好,最簡單的方法不僅會爲行,其中right_data.status = 1,那麼,試試這個:

COUNT(left_to_right.RID) OVER (PARTITION BY left_to_right.LID) AS NUM_RID 
COUNT(left_to_right.RID) OVER (PARTITION BY left_to_right.LID, right_data.STATUS) as num2, 
(case when right_data.STATUS = 1 
     then COUNT(left_to_right.RID) OVER (PARTITION BY left_to_right.LID, right_data.STATUS)/
      COUNT(left_to_right.RID) OVER (PARTITION BY left_to_right.LID) 
end) 

這是否對你的工作需要什麼?

+0

這並不壞。只是不在所有的數據中我需要什麼。 – 2013-02-26 16:45:07

+0

@IstvánSimon。 。 。我知道。我提出了更好的答案。 – 2013-02-26 16:46:46

相關問題