mysql:如何将多行分组成一行

时间:2013-05-31 04:16:11

标签: mysql sql syntax

帮帮我吧。我在mysql中的表看起来像这样:

kd_mapel|Sem1   |Sem2   |Sem3
EKO-001 |79     |NULL   |NULL
EKO-002 |NULL   |80     |NULL
FIS-001 |77     |NULL   |NULL
FIS-002 |NULL   |76     |NULL
FIS-201 |NULL   |NULL   |81
GEO-001 |79     |NULL   |NULL
INA-001 |79     |NULL   |NULL
INA-002 |NULL   |80     |NULL
INA-003 |NULL   |NULL   |79
ING-001 |77     |NULL   |NULL
ING-002 |NULL   |79     |NULL
ING-003 |NULL   |NULL   |80


预期结果是:

kd_mapel|Sem1   |Sem2   |Sem3
EKO     |79     |80     |NULL
FIS     |77     |76     |81
GEO     |79     |NULL   |NULL
INA     |79     |80     |79
ING     |77     |79     |80

是否可以将mysql代码用于这些结果?怎么样?
谢谢。

2 个答案:

答案 0 :(得分:4)

尝试此查询

select substring(kd_mapel, 1, locate("-", kd_mapel)-1) as kd, 
max(sem1), max(sem2), max(sem3)
from tbl
group by kd

FIDDLE

|  KD | MAX(SEM1) | MAX(SEM2) | MAX(SEM3) |
-------------------------------------------
| EKO |        79 |        80 |    (null) |
| FIS |        77 |        76 |        81 |
| GEO |        79 |    (null) |    (null) |
| INA |        79 |        80 |        79 |
| ING |        77 |        79 |        80 |

如果你有kd_mapel的多个sem记录,你甚至可以使用sum函数。

答案 1 :(得分:2)

尝试

SELECT LEFT(kd_mapel, 3) kd_mapel, 
       MIN(Sem1) Semi1, 
       MIN(Sem2) Semi2, 
       MIN(Sem3) Semi3
  FROM table1
 GROUP BY LEFT(kd_mapel, 3)

输出:

| KD_MAPEL | SEMI1 |  SEMI2 |  SEMI3 |
--------------------------------------
|      EKO |    79 |     80 | (null) |
|      FIS |    77 |     76 |     81 |
|      GEO |    79 | (null) | (null) |
|      INA |    79 |     80 |     79 |
|      ING |    77 |     79 |     80 |

<强> SQLFiddle