2017-07-05 4 views
-1

Angenommen, es gibt eine SQL-Tabelle: testTable mit Spalten: clientID, colA, colB, colC.SQL-Gruppe mit ähnlicher Bedingung

reference clientID colA colB colC 
--------------------------------------------- 
001   1  test1 test2 test3 
002   1  test1 ball2 test3 
003   2  test1 ball2 test3 
004   2  test1 ball2 test3 
005   3  test1 test2 test3 
006   4  test1 test2 test3 
007   4  test1 test2 test3 
009   5  test1 ball2 test3 
--------------------------------------------- 

Ich möchte alle eindeutigen Zeilen auswählen, in denen colB wie 'test' ist und nach clientID gruppiert. so dass ich am Ende mit:

reference clientID colA colB colC 
---------------------------------------------- 
001    1  test1 test2 test3 
005    3  test1 test2 test3 
006    4  test1 test2 test3 
---------------------------------------------- 

EDIT: Referenzspalte ist einzigartig wenn ich verwende verschiedene select * .. von .. wo colB like '% test%' Gruppe von clientID dann die Ergebnisse zurückgegeben hat nicht clientID gruppiert

+0

In Ihrem Beispiel beiden Reihen für ClientID = 4 identisch sind. Was ist, wenn sie es nicht sind? Was möchtest du zeigen? –

+0

nur 1 Zeile, wenn mehrere Zeilen die gleiche clientID haben und colB 'test' enthält, sollen wir nach clientID gruppieren – yigames

+0

Aber was, wenn die selbe ClientID test1 und test2 in colA hat? –

Antwort

4

Wenn Sie Gruppe durch eine Spalte, werden Sie mehrere Zeilen in eine andere Spalten in select drehen hat Aggregatfunktionen oder Unterabfragen sein. Welche Funktion zu verwenden ist, hängt von Ihrem Bedarf ab. Mit MIN() wie in Beispiel unten geben Ihnen erste Ergebnis alphabetisch verwendet, wenn mit String-Spalte

SELECT clientID 
    , MIN(colA) AS colA 
    , MIN(colB) AS colB 
    , MIN(colC) AS colC 
FROM tableA 
WHERE colB LIKE '%test%' 
GROUP BY clientID 

Edit: hier eine andere Lösung ist, nicht GROUP BY verwenden, aber mit Common Table Expression mit ROW_NUMBER()

WITH CTE_Source AS 
(
    SELECT * 
    FROM TableA 
    WHERE colB LIKE '%test%' 
) 
, CTE_Filter AS 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ClientID ORDER BY reference) RN 
    FROM CTE_Source 
) 
SELECT * 
FROM CTE_Filter 
WHERE RN = 1 
+0

hat die Tabelle, die ich habe, viel mehr Spalten als colA, colB, colC also gibt es irgendeine Weise, die ich alle Spalten auswählen könnte? – yigames

+0

@yigames überprüfen Sie die aktualisierte Antwort –

+0

Vielen Dank, das funktioniert! – yigames

1

Nur ein distinct ist nicht ausreichend?

Select distinct * from #data where ColB like 'test%' 

Oder können Sie Top-1 mit Verbindungen verwenden, wenn Sie nur bestimmte Spalten erfordern auf verschiedene

Select top (1) with ties * from #groupby where ColB like 'test%' 
order by row_number() over(partition by clientid order by cola,colb,colc)--you can include your required columns only 
0

Die where-Klausel geht zu prüfen, bevor die mit und die Gruppe durch. Wenn Sie Datensätze wollen auszufiltern, bevor die Gruppierung die Bedingung geht in der where-Klausel, und wenn Sie gruppiert herausfiltern möchten zeichnet die Bedingung in der having-Klausel lautet:

select ... 
from ... 
where ... 
group by ... 
having ... 

oder etwas wie dieses, wenn oben Sache nicht

arbeitete
select ... 
from (
    select ... 
    from ... 
    where ... 
    group by ... 
    having ... 
) x 
where ... 
0

die Sie interessieren,

Select distinct * From tableA where colB like '%test%' 
+0

Sry Tippfehler, entfernen '.' Zwischen distinct und * – JayaPrakash

0

Wenn Sie GROUP BY verwenden Sie alle Spalten angeben, die Sie in der Abfrage verwenden, und dass eine Aggregation functi nicht verwenden auf. So zum Beispiel

SELECT CLIENTID, COLA, COLB, COLC, COUNT(*) AS RC 
FROM YOURTABLE 
WHERE COLB LIKE '%test%' 
GROUP BY CLIENTID, COLA, COLB, COLC 
0

einfach verwenden: -

group by clientID,colA,colB,colC 

statt

group by clientID 

Demo: -

Create table testTable (clientID int , colA varchar(10), colB varchar(10), colC varchar(10)) 
go 
insert into testTable values 
(1,'test1','test2','test3'), 
(1,'test1','ball2','test3'), 
(2,'test1','ball2','test3'), 
(2,'test1','ball2','test3'), 
(3,'test1','test2','test3'), 
(4,'test1','test2','test3'), 
(4,'test1','test2','test3'), 
(5,'test1','ball2','test3') 


select * from testTable 
where colB LIKE '%test%' 
group by clientID,colA,colB,colC 

Ausgang: -

clientID colA colB colC 
    1  test1 test2 test3 
    3  test1 test2 test3 
    4  test1 test2 test3 
+0

Warum GROUP BY, wenn keine Aggregatfunktionen beteiligt sind? – jarlh

+0

Sie haben Recht, stattdessen "distinct" verwenden. –