2009-06-11 13 views
1

Wie kann ich diesen Code in MySQL vereinfachen?SQL in mySQL komprimieren

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 

So dass die Anzahl der berechneten Daten dynamisch sind?

+1

) Ich denke, diese Frage wäre einfacher zu beantworten, wenn Sie uns sagten, was Sie wollen, das Ergebnis zu sein. Diese Abfrage sieht von Anfang an wie eine schlechte Idee aus. – Blixt

Antwort

0

Sie können nicht die Anzahl der Spalten dynamisch ändern, aber Sie können für jedes Datum sehr leicht getrennte Reihen erhalten:

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

Sie benötigen eine separate Abfrage tun, um die durchschnittlichen Daten zu erhalten:

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

Wenn ich Sie richtig verstehe, dann glaube ich nicht, dass Sie tun können, was Sie wollen: SQL funktioniert nicht so. Wenn Ihre Abfrage von einem anderen Programm verwendet wird und Sie die Anzahl der Tage, an denen Sie interessiert waren, kennen, können Sie sie vor dem Senden als String erstellen. Wenn Sie alle möglichen Anzahl von Tagen wollen und müssen eine einzelne SQL-Abfrage haben, dann wäre eine UNION, ich nehme an, es tun (obwohl ich zwei Abfragen bevorzugen würden):

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

Was wohl am besten funktioniert, ist dies aufzuspalten in zwei Abfragen, ein Durchschnittspreis und die Summe der Preise pro Person für das Laden:

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

und eine zweite für die Maxima wollen Sie wissen:

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

Wenn Sie wirklich die Spalten alle wollen in dem gleiche Abfrage, verwenden Sie eine Unterabfrage für die erste (

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');