2009-06-11 10 views
1

このコードをMySQLで単純化するにはどうすればよいですか?mySQLのSQLを縮退

SELECT name, 
    MAX(IF(to_days(thedate) - to_days('2009-06-13') = 0, price, '')) AS date1, 
    MAX(IF(to_days(thedate) - to_days('2009-06-13') = 1, price, '')) AS date2, 
    MAX(IF(to_days(thedate) - to_days('2009-06-13') = 2, price, '')) AS date3, 
    MAX(IF(to_days(thedate) - to_days('2009-06-13') = 3, price, '')) AS date4, 
    MAX(IF(to_days(thedate) - to_days('2009-06-13') = 4, price, '')) AS date5, 
    MAX(IF(to_days(thedate) - to_days('2009-06-13') = 5, price, '')) AS date6, 
    MAX(IF(to_days(thedate) - to_days('2009-06-13') = 6, price, '')) AS date7, 
AVG(price),SUM(price) 
FROM `personals` 
WHERE personal_id = '1234' 
GROUP BY name 

計算された日付の数は動的なので、

+1

(大規模なデータベースにあまりにも効率的ではないかもしれません)最初の1のためにサブクエリを使用しています。そのクエリは最初から悪い考えです。 – Blixt

答えて

0

あなたが動的に列の数を変更することはできませんが、非常に簡単に各日付に別々の行を取得することができます。

SELECT to_days(thedate) - to_days('2009-06-13') as interval, 
    max(price) FROM `personals` 
WHERE personal_id = '1234' 
GROUP BY name, thedate 

あなたは平均的なデータを取得するために別のクエリを実行する必要があります。

SELECT name, 
    AVG(price),SUM(price) 
FROM `personals` 
WHERE personal_id = '1234' 
GROUP BY name 
0

私はあなたが正しく理解していれば、私はあなたが望むことができるとは思わない:SQLはそのようには機能しない。あなたのクエリが別のプログラムから使用されていて、あなたが興味を持った日数のセットを知っていたら、それを提出する前に文字列として構築することができます。あなたは日のすべての可能な数字をしたいし、単一のSQLクエリを持っていなければならない場合(私は2つのクエリを好むだろうが)、その後UNIONは、私は考え、それを行うだろう:

SELECT 
    name 
, to_days(thedate) - to_days('2009-06-13') AS num_days 
, MAX(price) As max_price 
, NULL AS avg_price 
, NULL AS sum_price 
FROM `personals` 
WHERE personal_id = '1234' 
GROUP BY 
    name 
, to_days(thedate) - to_days('2009-06-13') 
UNION ALL 
SELECT 
    name 
, NULL 
, NULL 
, AVG(price) 
, SUM(price) 
FROM `personals` 
WHERE personal_id = '1234' 
GROUP BY name 
1

何おそらく最も効果的に機能することは、これを分割することですあなたが本当に列のすべての場合

SELECT 
    MAX(price) 
FROM `personals` 
WHERE personal_id = '1234' 
GROUP BY name, to_days(thedate) - to_days('2009-06-13'); 

SELECT 
    AVG(price), SUM(price) 
FROM `personals` 
WHERE personal_id = '1234' 
GROUP BY name; 

、あなたが知りたいの極大ための第二1:2つのクエリ、一人あたりの価格の平均価格との和をロードするための1にの中に 同じクエリ、私はあなたが結果になりたいものを私たちに語った場合は、この質問に答えるために容易になるだろうと思います

SELECT 
    MAX(price), 
    AVG(price), 
    SUM(price) 
FROM `personals` 
LEFT JOIN (
    SELECT 
    AVG(price), SUM(price), name 
    FROM `personals` 
    WHERE personal_id = '1234' -- # this line is optional 
    GROUP BY name 
) totals 
ON totals.name = personals.name 
WHERE personal_id = '1234' 
GROUP BY name, to_days(thedate) - to_days('2009-06-13'); 
関連する問題