1

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

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

計算された日付の数は動的ですか?

4

3 に答える 3

1

What probably works best is to split this into two queries, one for loading the average price and sum of prices per person:

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

and a second one for the maxima you want to know:

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

If you really want the columns all in the same query, use a subquery for the first one (might not be too efficient on large databases)

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');
于 2009-06-11T10:25:35.933 に答える
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
于 2009-06-11T09:36:08.357 に答える
0

私があなたのことを正しく理解しているのであれば、あなたがやりたいことはできないと思います。SQL はそのようには機能しません。クエリが別のプログラムから使用されていて、関心のある一連の日数がわかっている場合は、送信前にそれを文字列として作成できます。可能なすべての日数が必要で、単一の SQL クエリが必要な場合は、UNION がそれを行うと思います (ただし、2 つのクエリを使用することをお勧めします)。

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
于 2009-06-11T09:39:18.180 に答える