2013-02-08 58 views
1

我试图将行值转换为列名。在stackoverflow上搜索后,我知道它可以通过使用GROUP_CONCAT()来完成。我尝试过但没有结果。select * transform row value as table列名

我想要什么?

我有这样的一个表:

id | staff_id_staff  | leave_type_id_leave_type | days 
1 | 41     | Casual      | 7 
2 | 41     | Earned      | 1 
3 | 41     | Sick      | 4 

,并希望结果是这样的:

Casual | Earned | Sick 
7   |  1  | 4 

请注意:我不知道的leave_type_id_leave_type值(这将是任何东西)

这里是leave_remain表的代码:

CREATE TABLE IF NOT EXISTS `leave_remain` (
    `id_leave_remain` int(11) NOT NULL AUTO_INCREMENT, 
    `staff_id_staff` int(11) NOT NULL, 
    `leave_type_id_leave_type` int(11) NOT NULL, 
    `days` float DEFAULT NULL, 
    `updated` date DEFAULT NULL, 
    PRIMARY KEY (`id_leave_remain`), 
    UNIQUE KEY `leave_type_id_leave_type_UNIQUE` (`leave_type_id_leave_type`), 
    KEY `fk_leave_remain_staff1` (`staff_id_staff`), 
    KEY `fk_leave_remain_leave_type1` (`leave_type_id_leave_type`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=108 ; 

-- 
-- Dumping data for table `leave_remain` 
-- 

INSERT INTO `leave_remain` (`id_leave_remain`, `staff_id_staff`, `leave_type_id_leave_type`, `days`, `updated`) VALUES 
(82, 41, 16, 16, '2013-02-04'), 
(89, 41, 17, 178, '2013-02-06'), 
(107, 41, 18, 0, '2013-02-04'); 
+1

如果您不知道leave_type_id_leave_type的潜在值,那么您可能需要使用动态SQL。看到这篇文章:http://stackoverflow.com/a/12005676/1073631 – sgeddes

回答

2

看看您需要做类似的查询一些工作:

SELECT GROUP_CONCAT(CONVERT(leave_type_id_leave_type,char(10))) 
FROM leave_remain 
GROUP BY staff_id_staff 
UNION 
SELECT GROUP_CONCAT(CONVERT(days,char(10))) 
FROM leave_remain 
GROUP BY staff_id_staff 

检查演示上SqlFiddle

+0

我得到这个结果来执行后:'[BLOB - 2B] [BLOB - 2B] [BLOB - 1B]' – user007

+0

@ user1983017 只是上面的查询结果(左侧),你会看到+选项按下它。并标记 显示BLOB内容 我已经做了一些更正,所以它应该工作,无论如何,现在检查 – Minesh

-1
select leave_type_id_leave_type,days, 
count(case when leave_type_id_leave_type = 'Casual' THEN 1 END) Casual, 
count(case when leave_type_id_leave_type = 'Earned' THEN 1 END) Earned, 
count(case when leave_type_id_leave_type = 'Sick' THEN 1 END) Sick 
from leave_remain GROUP BY id_leave_remain 

SqlFiddle

+0

与您的查询创建SqlFiddle,但它不工作:( – Minesh

+0

对不起,最初我没有创建任何架构只写了一个示例代码。不,我认为它工作 –

1

试试下面的代码

SELECT 
max(DECODE(leave_type_id_leave_type,'Casual',days)) Casual, 
max(DECODE(leave_type_id_leave_type,'Earned',days)) Earned, 
max(DECODE(leave_type_id_leave_type,'Sick',days)) Sick 
FROM table_name;