2016-04-12 31 views
1

我有以下数据,我希望能将它们分组。在mysql中计算具有相同值的行,然后显示项目编号

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

我想组以下的输出:

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

请问可不可以? 到目前为止,这是我试过

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 

我得到的输出是

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

第二个数字并没有增加。

+0

解释你的逻辑。 –

+0

即时分类具有相同标签但不完全按组分组的项目,因为它只显示一个项目,我需要它显示所有项目,然后希望显示项目编号将服务器与此组相同每套标签号码 – hocuspocus31

回答

2

这是MySQL。你只需要正确的做算术变量:

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; 

你的方法不工作的原因是因为你重新设置每行计数器变量。因此,它从1"",空字符串被视为0 - 所以下一次安装时,它会增加到1.依此类推。

+0

非常感谢!它的工作现在。它说,我不能再接受3分钟后的答案,但生病肯定要检查你的答案。再次感谢你! – hocuspocus31

+1

戈登没有在新答案中包含这部分内容。但是你需要小心数据的顺序,因为可能会导致意想不到的结果。你应该添加一个类似的命令。 'ORDER BY标签, 如果标签类似于“%Install%”,那么请执行1 ELSE 0 END'以确保安装在最后一个安装位置。 –

+1

@ hocuspocus31。 。 。胡安是正确的。你真的应该有一个'order by'子句。 –

0

试试这个:

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 
相关问题