сжатый запрос с использованием SQL - PullRequest
2 голосов
/ 03 июня 2009

У меня есть таблица с 4 вещами, которые я хочу ... Имя, Цена, Кол-во и конкретная Дата

Есть много записей на дату:

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

Как я могу сжать это в:

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

Ответы [ 3 ]

7 голосов
/ 03 июня 2009

Я думаю, что это сделает это:

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

Это работает в два этапа, внутренний запрос растягивает данные, так что вы получите:

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

Затем внешний запрос группируется по имени, чтобы сгладить его до:

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
1 голос
/ 04 июня 2009

Я использовал что-то вроде этого:

Я использую mysql, он поддерживает PIVOT?

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
...