2017-10-25 9 views
1

私は> = 3つの異なる姓を持つ共通アドレスを選択するタスクを持っています。tsql集約フィールドの選択を最適化

私はちょうど私がそれを単一のステップで何とか行うことができると思い、他の解決策になるものを学びたい、いくつかのステップでこれをコード化され、私はSQL Server上だ2016

この最小/最大で動作します2+異なる名前のために、しかし、と私はより多くのロジックを行う必要3+私は

;WITH c AS 
(
    SELECT 'Dow' LName, 'John' Fname, '123 Main' addr 
    UNION 
    SELECT 'Alexander' LName, 'Mike' Fname, '123 Main' addr 
    UNION 
    SELECT 'Sam' LName, 'Kent' Fname, '123 Main' addr 
    UNION 
    SELECT 'Marth' LName, 'Rose' Fname,'123 Main' addr 
    UNION 
    SELECT 'Xavier' LName, 'Rob' Fname, '9000 Metaxa St' addr 
    UNION 
    SELECT 'Xavier' LName, 'Mary' Fname,'9000 Metaxa St' addr 
    UNION 
    SELECT '__Xavier' LName, 'Lucricia' Fname,'9000 Metaxa St' addr 
    UNION 
    SELECT 'Xclude' LName, 'John' Fname, 'Kirov 2 St' addr 
) 
, -- SELECT * FROM c 
c2 AS 
(
    SELECT MIN(lname) nameMin, MAX(lname) nameMax, addr, COUNT(*) cc 
    FROM c 
    GROUP BY addr 
) 
SELECT * 
FROM c2 
WHERE nameMin <> nameMax AND cc >=3 

答えて

2

あなたはグループ条件の異なる姓とHAVING()を取得するためCOUNT(DISTINCT)を使用して1つのステップでそれを行うことができると思います。

WITH c AS (
    SELECT 'Dow' LName, 'John' Fname, '123 Main' addr UNION 
    SELECT 'Alexander' LName, 'Mike' Fname, '123 Main' addr UNION 
    SELECT 'Sam' LName, 'Kent' Fname, '123 Main' addr UNION 
    SELECT 'Marth' LName, 'Rose' Fname,'123 Main' addr UNION 
    SELECT 'Xavier' LName, 'Rob' Fname, '9000 Metaxa St' addr UNION 
    SELECT 'Xavier' LName, 'Mary' Fname,'9000 Metaxa St' addr UNION 
    SELECT '__Xavier' LName, 'Lucricia' Fname,'9000 Metaxa St' addr UNION 
    SELECT 'Xclude' LName, 'John' Fname, 'Kirov 2 St' addr 
) 
SELECT addr, COUNT(DISTINCT LName) as LNameCount 
FROM c 
GROUP BY addr 
HAVING COUNT(distinct LName)>=3 
+0

Grz Alberto、もう1つ追加する必要があります。 –

関連する問題