2016-08-17 6 views
2
create table tab_1(
t1 decimal (10), 
t2 decimal (10), 
t3 decimal (10) 
); 

insert into tab_1(t1, t2, t3) 
values(1,-2,-5); 
insert into tab_1(t1, t2, t3) 
values(-3,4,6); 
insert into tab_1(t1, t2, t3) 
values(5,1,2); 

select @sum1:=sum(t1) FROM tab_1 WHERE t1 > 0 
select @sum2:=sum(t2) FROM tab_1 WHERE t2 > 0 
select @sum3:=sum(t3) FROM tab_1 WHERE t3 > 0 

select @sum1, @sum2, @sum3; 

Результаты:Транспонирование несколько столбцов в одну строку MySQL

@sum1 @sum2 @sum3 
------------------ 
    6  5  8 

У меня есть запрос выше, и я хочу запрос, который транспонировать столбцов в один столбец и 3 строк, как показано ниже:

Sum 
-- 
6 
5 
8 

Я использую MySQL Workbench 6.3.7.

+0

Вы ищете, что в SQL Server является функцией 'UNPIVOT'. К сожалению, у MySQL есть эта возможность из коробки, и мне сказали, что она становится очень уродливой, очень быстрой. Для простого примера, который вы дали, вы могли бы просто «СОЮЗ» объединить значения. –

ответ

0

Вы можете достичь этого через UNION ALL

SELECT SUM(IF(t1 > 0 , t1, 0)) AS sum FROM tab_1 
UNION ALL 
SELECT SUM(IF(t2 > 0 , t2, 0)) AS sum FROM tab_1 
UNION ALL 
SELECT SUM(IF(t3 > 0 , t3, 0)) AS sum FROM tab_1 

UNION vs UNION ALL

EDIT:

Для того, чтобы сохранить результаты в переменных: confused.why сделать вам это нужно?

SET @sum1 := 0; 
SET @sum2 := 0; 
SET @sum3 := 0; 
SELECT @sum1 := SUM(IF(t1 > 0 , t1, 0)) AS sum FROM tab_1 
UNION ALL 
SELECT @sum2:= SUM(IF(t2 > 0 , t2, 0)) AS sum FROM tab_1 
UNION ALL 
SELECT @sum3 := SUM(IF(t3 > 0 , t3, 0)) AS sum FROM tab_1; 

SELECT @sum1,@sum2,@sum3; 
+0

Спасибо, это прекрасно работает. Но как я могу добавить результаты в переменную, чтобы использовать ее дальше? – BOB

+0

Проверьте обновленный ответ – 1000111

0

Вы почти находитесь с вашими переменными назначениями. Просто поместите union all между ними:

select 't1', sum(t1) FROM tab_1 WHERE t1 > 0 
union all 
select 't2', sum(t2) FROM tab_1 WHERE t2 > 0 
union all 
select 't3', sum(t3) FROM tab_1 WHERE t3 > 0; 

(И я удалил назначение переменной, потому что не представляется необходимым.)

Я бы включать в себя идентификатор, так что я знаю, какое значение соответствует какой столбец.