2016-04-12 55 views
1

Aşağıdaki verilere sahibim ve onları gruplayabileceğimi umuyordum.Mysql ile aynı değere sahip satırları sayın ve sonra öğe numarasını göster

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

Bu mümkün mü:

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

bu çıkışa aşağıdaki gruba istedi? Şimdiye kadar bu i got çıkış

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

ikinci sayı artırmadı oldu

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 

çalıştığı şey budur.

+0

mantık açıklar. –

+0

Aynı etikete sahip olan ancak grupla tam olarak gruplandırılmayan öğeleri gruplandırarak ayırma im örneğidir, çünkü yalnızca bir öğe gösterecek ve öğelerin tümünü göstermesi gerekiyor ve bu durumda öğe numarasını bu gruba benzer şekilde gösterecektir. etiketin her seti için sayı – hocuspocus31

cevap

2

Bu, MySQL'dir. Sadece doğru değişken aritmetik yapmak gerekir: Her satırda sayaç değişkeni yeniden ayarlamadan çünkü

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; 

senin yöntem işe yaramazsa nedenidir. Yani, 1'dan ""'a gider ve boş dize 0 olarak kabul edilir - böylece sonraki yükleme, 1'e artırılır. Ve böyle devam eder.

+0

Çok teşekkür ederim! Şuan çalışıyor. Yanıtı 3 dakika sonra kabul edemediğimi söylüyor ama hastalığınızı kontrol ettiğinizden emin olun. tekrar teşekkürler! – hocuspocus31

+1

Gordon, bu bölümü yeni cevaba dahil etmedi. Ancak, beklenmedik bir sonuca neden olabileceğinden, verilerinizin sırasına göre dikkatli olmanız gerekir. Benzer bir sipariş eklemelisiniz. "ORDER by BY Label", "% Install%" BAŞLATILDIĞINDA, SONRA OLDUĞUNU SAKLAYIN. –

+1

@ hocuspocus31. . . Juan haklı. Gerçekten bir "sipariş" maddesine sahip olmalısın. –

0

bu deneyin:

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