2016-07-05 69 views
0

我有一個包含67列和大約36,000行的表,我需要根據其中兩列運行SELECT。在單表中選擇數據與1:多關係

重要的列是FINANCIAL_ACCOUNT_ID,EVENT_DESCRIPTION。

FINANCIAL_ACCOUNT_ID是每個帳戶的唯一編號,但在表格中可能不唯一。事件描述不是唯一的。事件描述可以包含'事件1''事件2''事件3'等等。

所以表看起來是這樣的:

TABLE 
+----------------------+-------------------+-------------+ 
| FINANCIAL_ACCOUNT_ID | EVENT_DESCRIPTION | OTHER_STUFF | 
+----------------------+-------------------+-------------+ 
| 1121    | Event 1   |  n/a  | 
| 107401    | Event 2   |  n/a  | 
| 256483    | Event 1   |  n/a  | 
| 1121    | Event 3   |  n/a  | 
| 107401    | Event 1   |  n/a  | 
| 363586    | Event 1   |  n/a  | 
| 546875    | Event 1   |  n/a  | 
| 546875    | Event 2   |  n/a  | 
+----------------------+-------------------+-------------+ 


RESULT 
+----------------------+-------------------+-------------+ 
| FINANCIAL_ACCOUNT_ID | EVENT_DESCRIPTION | OTHER_STUFF | 
+----------------------+-------------------+-------------+ 
| 107401    | Event 2   |  n/a  | 
| 107401    | Event 1   |  n/a  | 
| 546875    | Event 1   |  n/a  | 
| 546875    | Event 2   |  n/a  | 
+----------------------+-------------------+-------------+ 

我需要得到返回的是整個行是否有與既有「事件1」和「事件2」財務帳戶ID。

我試着使用的條款內合併聯接......在我的最新嘗試,我添加了一個計數(financial_account_id)如:

select FINANCIAL_ACCOUNT_ID, EVENT_DESCRIPTION, COUNT(FINANCIAL_ACCOUNT_ID) 
FROM master 
group by FINANCIAL_ACCOUNT_ID 
HAVING COUNT(FINANCIAL_ACCOUNT_ID) >1; 

然而,這裏是我的結果與select語句看到:(我說我需要整個行,但是一旦我得到正確的結果返回,我可以過濾掉無關列,我不需要)

Financial_Account_ID | Event_Description | COUNT(Financial_Account_ID) 
     107401   |  Event 2  |   2 
     546875   |  Event 1  |   2  

任何幫助像這樣的SQL查詢應該看起來像什麼? 詳情:MariaDB的10,數據庫名稱:JuneEvents,表名:主 我也得到了在MS-SQL 2012數據庫快速

編輯副本:@Tim - 對不起,我需要每個帳戶匹配「事件1」和「事件2」都會拋出事件3以及其他可能存在的事件。這說明了嗎?

SOLUTION: 我用@戈登的第2個查詢與JOIN作爲起跳點,並結束了,看上去像這樣的最終查詢(注:現在有一些額外的領域,但我最初的後添加他們查詢返回的結果propper從最初的數據集。)

SELECT t.financial_account_id, t.event_description, t.sold_quantity, t.paid_amount 
FROM master t JOIN 
    (SELECT financial_account_id 
     FROM master t 
     WHERE event_description IN ('Event 1', 'Event 2') 
     GROUP BY financial_account_id 
     HAVING COUNT(DISTINCT event_description) = 2 
    ) tt 
    ON tt.financial_account_id = t.financial_account_id 
    WHERE (event_description IN ('Event 1', 'Event 2') AND (sold_quantity > 0)); 
+0

你從來沒有給我們的邏輯來確定_which_' Event_Description'返回最終結果。 –

+0

「GROUP BY」功能非常強大,但使用任何日期時間列也可幫助區分結果。 根據Event_1和Event_2的拆分方式(它們是否可以同時發生?是否可以發生NULL值?),您可能需要使用子查詢。 顯然,我們需要更多關於業務邏輯和規則的細節。 –

+0

@RCMaples所以你是說你想要匹配有事件1和2的帳戶,而_only_事件1和2? –

回答

0

要獲得這兩個事件的帳戶,請使用:

SELECT financial_account_id 
FROM master t 
WHERE event_description IN ('Event 1', 'Event 2') 
GROUP BY financial_account_id 
HAVING COUNT(DISTINCT event_description) = 2; 

然後拿到原始行,使用JOIN

SELECT t.* 
FROM master t JOIN 
    (SELECT financial_account_id 
     FROM master t 
     WHERE event_description IN ('Event 1', 'Event 2') 
     GROUP BY financial_account_id 
     HAVING COUNT(DISTINCT event_description) = 2 
    ) tt 
    ON tt.financial_account_id = t.financial_account_id; 
+0

我用你的第二查詢與JOIN和結束了,看上去像這樣的最終查詢: SELECT t.financial_account_id,t.event_description,t.sold_quantity,t.paid_amount 師父牛逼JOIN (SELECT financial_account_id FROM主噸 WHERE EVENT_DESCRIPTION IN( '事件1', '事件2') GROUP BY financial_account_id HAVING COUNT(DISTINCT EVENT_DESCRIPTION)= 2 )TT ON tt.financial_account_id = t.financial_account_id WHERE(EVENT_DESCRIPTION IN('事件1「,」事件2「)和(sold_quantity> 0)); –

0

下面的查詢將產生所有FINANCIAL_ACCOUNT_ID既具有'Event 1''Event 2',並只有這兩個事件。如果你想提取其他信息,你可以很容易地將這個結果加入到另一個表中。

SELECT FINANCIAL_ACCOUNT_ID, 
    SUM(CASE WHEN EVENT_DESCRIPTION IN ('Event 1', 'Event 2') THEN 1 ELSE 0 END) AS eventCount 
FROM yourTable 
GROUP BY FINANCIAL_ACCOUNT_ID 
HAVING eventCount = 2 AND COUNT(*) = 2