2016-04-12 3 views
1

Ich habe die folgenden Daten und ich hoffte, dass ich sie gruppieren kann.Zählen Sie Zeilen, die in mysql den gleichen Wert haben und zeigen Sie dann Artikelnummer

|  Label    |  Category  | 
| PC Equipment   |  Materials  | 
| PC Equipment   |  Materials  | 
| PC Equipment - Install|  Installation | 
| Table Setup   |  Materials  | 
| Table Setup   |  Materials  | 
| Table Setup - Install |  Installation | 

I Gruppe wollte folgend diese Ausgabe:

| Item #|  Label    |  Category  | 
|  | PC Equipment   |  Materials  | 
|  | PC Equipment   |  Materials  | 
| 1 | PC Equipment - Install|  Installation | 
|  | Table Setup   |  Materials  | 
|  | Table Setup   |  Materials  | 
| 2 | Table Setup - Install |  Installation | 

das möglich sein würde? Bisher ist es das, was ich versuchte,

SELECT 
    @row_number := CASE WHEN Label LIKE "%Install%" THEN @row_number + 1 
         ELSE "" 
        END AS row_number, 
    Label  
FROM table1 t, 
    (SELECT @rownum := 0) r 
WHERE deleted = 0 

Der Ausgang war ich bekam

| Item #|  Label    |  Category  | 
|  | PC Equipment   |  Materials  | 
|  | PC Equipment   |  Materials  | 
| 1 | PC Equipment - Install|  Installation | 
|  | Table Setup   |  Materials  | 
|  | Table Setup   |  Materials  | 
| 1 | Table Setup - Install |  Installation | 

die zweite Zahl erhöht sich nicht.

+0

Ihre Logik erklären. –

+0

Ich gruppiere die Elemente, die das gleiche Label haben, gruppiere sie aber nicht genau, weil es nur ein Element anzeigt. Ich brauche es, um alle Elemente anzuzeigen und dann hoffe ich, dass die Elementnummer wie diese Gruppe angezeigt wird Nummer für jeden Etikettensatz – hocuspocus31

Antwort

2

Dies ist MySQL. Sie müssen nur richtig die Variable Arithmetik tun:

SELECT (CASE WHEN Label LIKE '%Install%' 
      THEN cast(@icnt := @icnt + 1 as char(10)) 
      ELSE '' 
     END) AS row_number, 
     Label  
FROM table1 t CROSS JOIN 
    (SELECT @icnt := 0) params 
WHERE deleted = 0; 

Der Grund Ihrer Methode nicht der Fall funktioniert, weil Sie die Zählervariable in jeder Zeile wieder einstellen werden. So geht es von 1 zu "", und die leere Zeichenfolge wird als 0 behandelt - also die nächste Installation, es wird auf 1 erhöht. Und so weiter.

+0

Vielen Dank! Es funktioniert jetzt. Es sagt, dass ich die Antwort nach 3 weiteren Minuten nicht akzeptieren kann, aber stellen Sie sicher, dass Sie Ihre Antwort überprüfen. Danke nochmal! – hocuspocus31

+1

Gordon hat diesen Teil nicht in die neue Antwort aufgenommen. Aber Sie müssen vorsichtig mit der Reihenfolge Ihrer Daten sein, da dies zu unerwarteten Ergebnissen führen kann. Sie sollten eine Reihenfolge nach like hinzufügen. 'ORDER BY Label, FALL WENN Label WIE"% Install% "THEN 1 ELSE 0 END ', um sicherzustellen, dass die Installation in der letzten. –

+1

@hocuspocus31. . . Juan hat Recht. Sie sollten wirklich eine 'Order by'-Klausel haben. –

0

Try this:

SELECT IF(Label LIKE "%Install%", rn, '') AS 'Item #', 
     Label, Category 
FROM (
    SELECT @row_number := CASE 
          WHEN Label LIKE "%Install%" THEN @row_number + 1 
          ELSE @row_number 
         END AS rn, 
     Label, Category 
    FROM table1 AS t 
    (SELECT @row_number := 0) AS r 
    WHERE deleted = 0 
    ORDER BY Label) AS t 
Verwandte Themen