2016-09-13 13 views
2

私は、各エントリにカウントが表示されるように解決策を探しています。しかし、私が試みたすべてのクエリは、すべてのエントリを1つの行にグループ化するか、または1つのカウントを間違っています。私は、NOT NULLであるcomplete_dateで、「last_4_ssn」と「タイプ」「をlast_nameの」をチェックし、カウントを取得しようとしている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 | 
------------------------------------------------------ 

はここ数なしに私のテーブルです。

私はこのように見えるように私の結果のテーブルをしたいと思います:完全な日付と完全な日付と3つのFEと2 CCがあるか

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

お知らせ?これは私が得ようとしている数です。ここで、last_name、last_4_ssnおよびtype allは同じであり、complete_datesはNOT 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のままにする必要があると思います。 – Terminus

+1

@Terminusあなたは正しいです、それはLEFT JOINである必要があります。フィドルのおかげで、私はこれと他のわずかな修正をすることができました。 –

+0

あなたは本当に忍者です!これはすごくうまくいった!私はWHEREの代わりにSUMを使用することは決して考えなかったでしょう。ありがとうございました! – sevmusic

関連する問題