我有3张桌子:
我想在以下专栏中显示这些信息:
origin | destination | provider name 1 | provider name 2 | provider name 3
q.origin | q.destin | price(quote | price(quote) | price(quote)
价格表将链接来自同一报价(航班)的多个提供商的价格。
我希望有人可以帮助我解决这个问题。我一直尝试使用内部联接的不同方法,但我不能将提供者作为列来显示每行报价在一行中。
答案 0 :(得分:1)
条件聚合适用于任何数据库:
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
无法完成此任务。
答案 1 :(得分:0)
在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
列名称需要硬编码 但如果一个人不想对名称进行硬编码,则需要Dynamic SQL。