Search code examples
mysqlsqlunpivot

SELECT SUM(DISTINCT values) across multiple columns in MYSQL


I have a MySQL table with 5 columns to store various values. For each record in the table the 5 columns store a single value (one of about 15). Here's an example of the structure:

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

I'd like to create a query that sums the unique values across each of those 5 columns. The result should show total number of times val1, val2, val3, etc are present across the 5 columns.

Ideally the result would be structured as:

val  | total
_____________________

val1 |  34

val2 |  12

val3 |  23

val4 |  14

val5 |  21

etc  |  etc

Thanks in advance for the help, much appreciated.


Solution

  • One way: 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 
    

    Or another: 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