Как выбрать 3 разных стола - PullRequest
0 голосов
/ 19 мая 2018

У меня есть 3 таблицы:

  1. Провайдер (id_provider, имя_поставщика и т. Д.)
  2. Цитата (id_quote, источник, пункт назначения и т. Д.)
  3. Цена(id_provider, id_quote, price)

Я хотел бы показать информацию в следующих столбцах:

origin   | destination | provider name 1 | provider name 2 | provider name 3
q.origin | q.destin    | price(quote     |  price(quote)   |  price(quote)

таблица цен свяжет цены нескольких поставщиков из одной и той же цитаты(полет).

Я надеюсь, что кто-то здесь может помочь мне с этим.Я пробовал разные подходы с внутренним объединением, но я не могу привести поставщиков в столбце, чтобы показать их цены для каждой цитаты в одной строке.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Условное агрегирование работает в любой базе данных:

SELECT qt.origin, qt.destination,
       MAX(CASE WHEN p.provider_name = 'provider name 1' then pr.price END) as price_1,
       MAX(CASE WHEN p.provider_name = 'provider name 2' then pr.price END) as price_2,
       MAX(CASE WHEN p.provider_name = 'provider name 3' then pr.price END) as price_3
FROM Price pr JOIN
     Quote q
     ON q.id_quote = pr.id_quote JOIN
     Provider p
     ON p.id_provider = pr.id_provider
GROUP BY q.origin, q.destination;

Для этого также требуется фиксированный список поставщиков.Если вы не знаете провайдеров, которые вам нужны в столбцах, у вас есть проблема, которая требует динамического SQL - а простой select не может выполнить эту работу.

0 голосов
/ 19 мая 2018

В MS SQL Server (2008+) для этого можно использовать PIVOT.

Пример:

SELECT *
FROM (
   SELECT TOP 1 WITH TIES
     qt.origin, qt.destination, prv.provider_name, prc.price
   FROM Price prc
   JOIN Quote qt ON (qt.id_quote = prc.id_quote)
   JOIN Provider prv ON (prv.id_provider = prc.id_provider)
   WHERE prv.provider_name IN 
         (
          'provider name 1',
          'provider name 2',
          'provider name 3'
         )
   ORDER BY ROW_NUMBER() OVER (PARTITION BY qt.origin, qt.destination, prv.id_provider ORDER BY qt.id_quote DESC)
) src
PIVOT  
(  
     MAX(prc.price)  
     FOR prv.provider_name IN 
         (
          [provider name 1],
          [provider name 2],
          [provider name 3]
         )
) pvt

Имена столбцов должны быть жестко закодированы.
Но если кто-то не хочет жестко кодировать имена, тогда Динамический SQL будет необходим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...