2011-08-07 3 views
0

何らかの理由でこれを行う必要があります。いつか(上記のような)複数行を1行に変更するマルチカラム

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行:私はこのような結果たクエリを有します。 私はちょうど1行と、このようなマルチコラム(ちょうど1行下のリスト)に行を変更したい:

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 

問合せの戻りかのわずか3行、total4まで列limit4の値は空になります。私はそのようにする方法を知らない。

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 

私はこのようにそれ1行にしよう:

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 

それは私のように仕事リストがされるので、私は1つのID列を追加

編集

4行は期待されていますが、3行は動作しません。カーソルを使うべきですか?

+0

特定の方法で出力をフォーマットするのは、データベースではなくデータベースと通信するアプリケーションの作業です。 –

+0

Hi Dan、実際にはmysqlストアドプロシージャからのリスト出力は1行しか受け付けない別のストアドプロシージャに送られます。 – 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がfalseの場合、真と0場合1あるので、これを乗じ使用すると、異なるグループに結果をフィルタリングするための簡単な方法ですので、これは動作します。

+0

こんにちはボヘミアン、私はリストが動的であることを忘れていた。私は編集した質問のリストを表示するためにいくつかの変更を行います。 – advcha

関連する問題