在MYSQL中跨多个列的SELECT SUM(DISTINCT值)

时间:2013-12-09 22:49:56

标签: mysql sql unpivot

我有一个包含5列的MySQL表来存储各种值。对于表中的每个记录,5列存储单个值(大约15个中的一个)。以下是结构示例:

| COL1 | COL2 | COL3 |  COL4 |  COL5 |
|------|------|------|-------|-------|
| val1 | val3 | val8 | val11 | val14 |
| val2 | val3 | val5 |  val9 | val12 |
| val1 | val2 | val6 | val14 | val15 |
| val3 | val5 | val9 | val10 | val12 |
| val2 | val4 | val7 | val11 | val14 |

我想创建一个查询,对这5列中的每一列的唯一值求和。结果应显示5列中存在val1,val2,val3等的总次数。

理想情况下,结果的结构如下:

val  | total
_____________________

val1 |  34

val2 |  12

val3 |  23

val4 |  14

val5 |  21

etc  |  etc

提前感谢您的帮助,非常感谢。

1 个答案:

答案 0 :(得分:4)

单向:SQL Fiddle

SELECT val,
       COUNT(*) AS total
FROM   (SELECT Col1 AS Val
        FROM   YourTable
        UNION ALL
        SELECT Col2 AS Val
        FROM   YourTable
        UNION ALL
        SELECT Col3 AS Val
        FROM   YourTable
        UNION ALL
        SELECT Col4 AS Val
        FROM   YourTable
        UNION ALL
        SELECT Col5 AS Val
        FROM   YourTable) AS T
GROUP  BY val 

或另一个:SQL Fiddle

SELECT CASE N
         WHEN 1 THEN Col1
         WHEN 2 THEN Col2
         WHEN 3 THEN Col3
         WHEN 4 THEN Col4
         WHEN 5 THEN Col5
       END AS Val,
       COUNT(*) AS total
FROM   YourTable
       CROSS JOIN (SELECT 1 AS N
                   UNION ALL
                   SELECT 2
                   UNION ALL
                   SELECT 3
                   UNION ALL
                   SELECT 4
                   UNION ALL
                   SELECT 5) AS T
GROUP  BY Val