2009-06-03 5 views
2

Ich habe eine Tabelle mit 4 Dinge, die ich will ... den Namen, Preis, Menge und zu einem bestimmten DatumSQL-Abfrage mit Hilfe der Kondensations

Es gibt viele Einträge pro Tag:

Name   Price Date 

Twin Private $25 06/02/09 
Double  $35 06/02/09 
Single  $20 06/02/09 
Twin Private $25 06/03/09 
Double  $35 06/03/09 
Single  $20 06/03/09 
Twin Private $25 06/04/09 
Double  $35 06/04/09 
Single  $20 06/04/09 

Wie kann ich kondensieren sie in:

Name   Price_06/02/09 Price_06/03/09 Price_06/04/09 

Twin Private $25    $25    $30 
Double  $35    $35    $50 
Single  $20    $20    $40 
+1

Meine Antwort stimmt nicht mit Ihrem Ergebnis überein, weil das erwartete Ergebnis nicht mit der Eingabe übereinstimmt. Gibt es etwas, das mir fehlt? –

+0

@Garry Shutter: Das Ergebnis scheint in der Frage falsch zu sein, es sei denn, es gibt eine andere Variable, die berücksichtigt werden muss. – Sung

Antwort

1

ich am Ende so etwas wie dies mit:

ich mysql bin mit, es PIVOT unterstützt das?

SELECT 


    name, room_id, 

     MAX(IF(to_days(bookdate) - to_days('2009-06-24') = 0, price, '')) AS Day1, 
     MAX(IF(to_days(bookdate) - to_days('2009-06-24') = 1, price, '')) AS Day2, 
     MAX(IF(to_days(bookdate) - to_days('2009-06-24') = 2, price, '')) AS Day3, 
     MAX(IF(to_days(bookdate) - to_days('2009-06-24') = 3, price, '')) AS Day4, 
     MAX(IF(to_days(bookdate) - to_days('2009-06-24') = 4, price, '')) AS Day5, 
     MAX(IF(to_days(bookdate) - to_days('2009-06-24') = 5, price, '')) AS Day6, 
     MAX(IF(to_days(bookdate) - to_days('2009-06-24') = 6, price, '')) AS Day7, spots 
    FROM `availables` 
    GROUP BY name 
+0

Dies ist bekannt als eine "charakteristische Funktion"; siehe hier: http://www.cs.newpaltz.edu/~pletcha/ADB/char_func.pdf –

7

ich denke, das wird es tun:

select Name, 
     max(Price_06/02/09) as Price_06/02/09, 
     max(Price_06/03/09) as Price_06/03/09, 
     max(Price_06/04/09) as Price_06/04/09 
from (
     select Name, 
        case Date 
         when '06/02/09' then Price 
         else null 
        end as Price_06/02/09, 
        case Date 
         when '06/03/09' then Price 
         else null 
        end as Price_06/03/09, 
        case Date 
         when '06/04/09' then Price 
         else null 
        end as Price_06/04/09 
     from  Rates) as Aggregated 
group by 
     Name 

Das in zwei Stufen arbeitet, erstreckt sich die innere Abfrage der Daten, so dass Sie am Ende folgendes haben:

Name   Price_06/02/09 Price_06/03/09 Price_06/04/09 

Twin Private $25    null   null 
Double  $35    null   null 
Single  $20    null   null 
Twin Private null   $25    null 
Double  null   $35    null 
Single  null   $20    null 
Twin Private null   null   $25 
Double  null   null   $35 
Single  null   null   $20 

den äußeren Abfragegruppen mit dem Namen Dann ist es zu flach zu machen:

Name   Price_06/02/09 Price_06/03/09 Price_06/04/09 

Twin Private $25    $25    $25 
Double  $35    $35    $35 
Single  $20    $20    $20 
+0

Wenn die Datumsspalten dynamisch sein müssen, könnten Sie PIVOT –

+0

Leider funktioniert diese Abfrage nicht, wenn es mehr als diese drei Daten gibt. Einmal musste ich in ähnlichem Fall den Query Builder programmieren. –

+0

Pivot, vor allem in caps macht mich an Freunde denken http://www.youtube.com/watch?v=B_PklVas9cA –

0

Zusätzlich zu Garry Shutlers answer könnte es nützlich sein, Spalten und Zeilen an Orten zu ändern, da es definitiv nur eine begrenzte Anzahl von Raumnamen gibt, aber wir können dies nicht über Daten sagen.