2016-09-13 27 views
2

我一直在試圖找到一個解決方案,讓每個條目都有一個計數,並且存在重複。但是,我試過的每個查詢要麼將所有條目分組到一行或一個計數是不正確的。MySQL在沒有分組的情況下獲取子查詢中的計數

這裏是我的表不計數:

------------------------------------------------------ 
| id | last_name | last_4_ssn | type | complete_date | 
------------------------------------------------------ 
| 1 | TEST  | 1234  | CC | NULL   | 
| 2 | TEST  | 1234  | CC | NULL   | 
| 3 | TEST  | 1234  | CC | 2016-09-11 | 
| 4 | TEST  | 1234  | CC | 2016-09-06 | 
| 5 | TEST  | 1234  | CC | NULL   | 
| 6 | TEST  | 1234  | FE | 2016-08-30 | 
| 7 | TEST  | 1234  | FE | 2016-09-01 | 
| 8 | TEST  | 1234  | FE | 2016-09-02 | 
------------------------------------------------------ 

我試圖得到了一個檢查「姓氏」,「last_4_ssn」和「類型」與complete_date是NOT NULL計數。

我想我得到的表看起來像這樣:

-------------------------------------------------------------- 
| id | last_name | last_4_ssn | type | complete_date | count | 
-------------------------------------------------------------- 
| 1 | TEST  | 1234  | CC | NULL   | 0  | 
| 2 | TEST  | 1234  | CC | NULL   | 0  | 
| 3 | TEST  | 1234  | CC | 2016-09-11 | 2  | 
| 4 | TEST  | 1234  | CC | 2016-09-06 | 2  | 
| 5 | TEST  | 1234  | CC | NULL   | 0  | 
| 6 | TEST  | 1234  | FE | 2016-08-30 | 3  | 
| 7 | TEST  | 1234  | FE | 2016-09-01 | 3  | 
| 8 | TEST  | 1234  | FE | 2016-09-02 | 3  | 
-------------------------------------------------------------- 

請注意有2 CC與完整日期和3層的FE具有完整的日期?這是我想要得到的數量;其中last_name,last_4_ssn和type都相同且它們的complete_dates不爲NULL。

,我想目前的SQL是(但不是完全沒有):

SELECT 
    clients.id, 
    clients.session_type, 
    clients.last_name, 
    clients.complete_date, 
    clients.last_4_ssn, 
    dups.the_count 
FROM clients 
LEFT JOIN (
    SELECT id, 
     COUNT(*) AS the_count, 
     session_type, 
     last_4_ssn, 
     last_name, 
     complete_date 
    FROM `clients`   
    GROUP BY last_name, last_4_ssn, session_type 
    HAVING the_count > 1 AND complete_date IS NOT NULL) AS dups 
ON (dups.last_4_ssn = clients.last_4_ssn AND dups.last_name = clients.last_name AND dups.session_type = clients.session_type) 
GROUP BY clients.id 

任何想法,將不勝感激。謝謝你的時間!

回答

2
SELECT t1.*, 
     COALESECE(t2.count, 0)    -- NULL dates should show a 0 count 
FROM clients t1 
LEFT JOIN 
(
    SELECT last_name, 
      last_4_ssn, 
      type, 
      SUM(CASE WHEN complete_date IS NOT NULL THEN 1 ELSE 0 END) AS `count` 
    FROM clients 
    GROUP BY last_name, 
      last_4_ssn, 
      type 
) t2 
    ON t1.last_name = t2.last_name AND -- join on name, ssn, and type 
     t1.last_4_ssn = t2.last_4_ssn AND 
     t1.type  = t2.type AND 
     t1.complete_date IS NOT NULL  -- but only join the count if date not NULL 

演示在這裏:

SQLFiddle

+0

太快,我。我認爲'INNER JOIN'需要保持'LEFT JOIN' tho。 – Terminus

+1

@Terminus你說得對,它需要是一個'LEFT JOIN'。感謝小提琴,我能夠做出這個和另一個小小的修正。 –

+0

你真是忍者!這非常有效!我永遠不會想到用SUM作爲WHERE的替代品,太棒了!謝謝! – sevmusic

相關問題