2011-08-07 4 views
0

어떤 이유로이 작업을 수행해야합니다. 언젠가 (위 같은)다중 행을 하나의 행 - 다중 열로 변경

limit  usage  tariff  total     
0 10  10   700  7000     
11 20  10   900  9000     
21 30  10   1800  18000     
31 >  11   2700  29700 

쿼리 반환 4 행의 최대하거나 3 행 : 나는 다음과 같은 결과를 한 쿼리가 있습니다. 쿼리 반환 불과 3 행, 열 limit4의 값이 될 때까지를 total4가 비어있는 경우

limit1  usage1  tariff1  total1 limit2  usage2  tariff2  total2    
0 10  10   700   7000 11 20  10   900   9000  


limit3  usage3  tariff3  total3 limit4  usage4  tariff4  total4      
21 30  10   1800   18000  31 >  11   2700  29700 

: 는이 같은 하나의 행과 다중 열 (한 행 아래 목록)에 행을 변경하려면 . 나는 그렇게하는 법을 모른다.

EDITED

목록이 될 것입니다 그래서 하나의 ID 열을 추가 :

ID limit  usage  tariff  total     
1 0 10  10   700  7000     
2 11 20  10   900  9000     
3 21 30  10   1800  18000     
4 31 >  11   2700  29700 

나는 이런 식으로 하나 개의 행을 만들려고 :

SELECT e.*,f.id AS id4,f.limit AS limit4,f.usage AS usage4,f.tariff AS tariff4,f.total AS total4 
FROM 
(SELECT c.*,d.id AS id3,d.limit AS limit3,d.usage AS usage3,d.tariff AS tariff3,d.total AS total3 
FROM 
(SELECT b.id AS id1,b.limit AS limit1,b.usage AS usage1,b.tariff AS tariff1,b.total AS total1, 
a.id AS id2,a.limit AS limit2,a.usage AS usage2,a.tariff AS tariff2,a.total AS total2 
FROM testtariff a 
INNER JOIN testtariff b ON a.id!=b.id 
LIMIT 1) c INNER JOIN testtariff d ON c.id1 != d.id AND c.id2 != d.id 
LIMIT 1) e INNER JOIN testtariff f ON e.id1 != f.id AND e.id2 != f.id 
AND e.id3 != f.id 
LIMIT 1 

가 나는대로 작동 4 행은 예상되지만 3 행은 작동하지 않습니다. 커서를 사용해야합니까?

+0

특정 방식으로 출력 형식을 지정하는 것은 데이터베이스가 아닌 데이터베이스와 통신하는 응용 프로그램의 작업입니다. –

+0

안녕 댄, 실제로 MySQL의 저장 프로 시저에서 출력 목록과 하나의 행을 수락하는 다른 저장 프로 시저를 피드 것입니다. – advcha

답변

0

일반적으로 "피벗"이라고합니다. 여기 당신이 그것을 할 방법은 다음과 같습니다

select 
    '0 10' as limit1, 
    sum(limit between 0 and 10 * usage) as usage1, 
    sum(limit between 0 and 10 * tariff) as tariff1, 
    sum(limit between 0 and 10 * usage * tariff) as total1, 
    '11 20' as limit2, 
    sum(limit between 11 and 20 * usage) as usage2, 
    sum(limit between 11 and 20 * tariff) as tariff2, 
    sum(limit between 11 and 20 * usage * tariff) as total2, 
    -- etc 
from mytable 
group by 1,5 -- etc 

limit between x and x 그래서이 곱하면 다른 그룹으로 결과를 필터링 할 수있는 간단한 방법입니다 사용 1 경우는 true 0 false의 경우이기 때문에이 작동합니다.

+0

안녕하세요 보헤미안, 나는 목록이 동적다는 것을 말하는 것을 잊었다. 나는 편집 한 나의 질문에있는 목록을 표시하기 위해 약간의 수정을한다. – advcha