Enrico
Enrico

Reputation: 2037

Combine multiple rows to one row

I have a table with 3 columns:

COLUMN A: DATETIME
COLUMN B: DOUBLE
COLUMN C: INT

Column A is not unique there are many rows with the same DATETIME value, however for every DATETIME COLUMN C is unique.

Background: Somebody measured on 5 different positions a temperature and this is stored in the database as:

COLUMN A | COLUMN B | COLUMN C

12:00    |   23.4   |  4

12:00    |   24.4   |  5

12:00    |   25.4   |  6

12:01    |   26.4   |  4

12:01    |   27.4   |  5

12:01    |   28.4   |  6

I would like to transform this (in a new table or view) into something like:

COLUMN AA | COLUMNC_VALUE-4 | COLUMNC_VALUE-5 | COLUMNC_VALUE 6

12:00     |    23.4         |       24.4      |      25.4

12:01     |    26.4         |       27.4      |      28.4

The values in Column C can be found in another table.

Is this possible in SQL or do I have to write some code?

Upvotes: 1

Views: 3652

Answers (2)

Alma Do
Alma Do

Reputation: 37365

It is a common problem named pivot table. And my opinion is - you should do that in application, not in SQL - that is because it's unreliable to act such way in DBMS. Imagine you will have 100 different values for columnC - what then? Or different count of columnC values per one datetime.

But if you still want to do that in MySQL, here is a good answer for this issue.

Upvotes: 2

John Woo
John Woo

Reputation: 263693

You want to transpose data but since MySQL does not have a builtin PIVOT() function, you can manually do it using MAX() and CASE.

SELECT  ColA,
        MAX(CASE WHEN ColC = 4 THEN ColB END) ColC_V4,
        MAX(CASE WHEN ColC = 5 THEN ColB END) ColC_V5,
        MAX(CASE WHEN ColC = 6 THEN ColB END) ColC_V6
FROM    TableName
GROUP   BY ColA

However, if you have unknown number of values in ColC, a much better way is to do in dynamically,

SET @sql = NULL;

SELECT  GROUP_CONCAT(DISTINCT
        CONCAT('MAX(CASE WHEN ColC = ''',
               ColC,
               ''' THEN ColB ELSE NULL END) AS ',
               CONCAT('`ColC_V', ColC, '`')
               )) INTO @sql
FROM TableName;

SET @sql = CONCAT('SELECT ColA, ', @sql, ' 
                   FROM TableName
                   GROUP BY ColA');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Upvotes: 2

Related Questions