简体   繁体   中英

Transposing a column into three new columns in mysql

I have a table in mysql with the following columns:

在此处输入图片说明

Example of data:

'16', '1', 'Evening', '6.00', '2014-06-05 08:14:35', '2014-06-04', '6.00'
'17', '2', 'Afternoon', '8.00', '2014-06-05 08:15:29', '2014-06-04', '8.00'
'18', '3', 'Afternoon', '4.00', '2014-06-05 08:17:32', '2014-06-04', '4.00'
'19', '4', 'Afternoon', '4.00', '2014-06-05 08:18:25', '2014-06-04', '4.00'
'20', '17', 'Morning', '2.00', '2014-06-05 09:11:40', '2014-06-05', '2.00'
'21', '17', 'Morning', '3.00', '2014-06-05 09:16:36', '2014-06-04', '3.00'
'22', '17', 'Evening', '2.00', '2014-06-05 09:17:43', '2014-06-04', '2.00'
'23', '19', 'Morning', '1.00', '2014-06-05 10:12:47', '2014-06-05', '1.00'
'24', '20', 'Morning', '2.00', '2014-06-05 10:16:02', '2014-06-05', '2.00'
'25', '22', 'Morning', '2.00', '2014-06-05 10:27:34', '2014-06-05', '2.00'
'26', '23', 'Morning', '2.00', '2014-06-05 10:28:08', '2014-06-05', '2.00'
'27', '24', 'Morning', '1.00', '2014-06-05 10:30:20', '2014-06-05', '1.00'
'28', '27', 'Morning', '1.00', '2014-06-05 10:43:12', '2014-06-05', '1.00'
'29', '27', 'Combined', '2.00', '2014-06-05 10:45:45', '2014-06-04', '2.00'
'31', '28', 'Morning', '3.00', '2014-06-05 11:04:32', '2014-06-05', '3.00'

I would like to transpose the time column so that I have three new columns evening, afternoon and morning and record the quantity so that columns look like
id, cow_id, Evening, Afternoon, Morning, date_added, date,quantity_type

Could someone give me a solution on how to go about this with mysql query?

Try this:

SELECT id, cow_id,
    IF(time = 'Morning',quantity,0) AS Morning,
    IF(time = 'Afternoon',quantity,0) AS Afternoon,
    IF(time = 'Evening',quantity,0) AS Evening,
    date_added, quantity_type
FROM OriginalTable

It works by only including the quantity if the time matches the particular value and then aliases the column name to make the output prettier.

If you want to have all a cow's feeds for a given date on one line, you could try something like this:

SELECT cow_id, 
    SUM(CASE time WHEN 'Evening' THEN quantity ELSE 0 END) AS Evening,
    SUM(CASE time WHEN 'Afternoon' THEN quantity ELSE 0 END) AS Afternoon,
    SUM(CASE time WHEN 'Morning' THEN quantity ELSE 0 END) AS Morning,
    SUM(CASE time WHEN 'Combined' THEN quantity ELSE 0 END) AS Combined,
    `date`
FROM cows
GROUP BY cow_id, date

For your sample data, this would give a result like this (note I had to add another column for the 'Combined' time):

cow_id  Evening Afternoon   Morning Combined    date    
1       6       0           0       0           2014-06-04  
2       0       8           0       0           2014-06-04  
3       0       4           0       0           2014-06-04  
4       0       4           0       0           2014-06-04  
17      2       0           3       0           2014-06-04  
17      0       0           2       0           2014-06-05  
19      0       0           1       0           2014-06-05  
20      0       0           2       0           2014-06-05  
22      0       0           2       0           2014-06-05  
23      0       0           2       0           2014-06-05  
27      0       0           0       2           2014-06-04  
27      0       0           1       0           2014-06-05  
28      0       0           3       0           2014-06-05  

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM