Могу ли я объединить PIVOT с внутренним объединением в Microsoft SQL Server? - PullRequest
4 голосов
/ 19 февраля 2010

У меня следующий запрос SQL:

SELECT CountryID, [10201] AS CountryGDPPerCapita, [10677] AS LifeExpTotal
FROM
(
    SELECT CountryID,FieldID,numeric 
    FROM globaledge.dbo.DIBS_Data
    WHERE CountryID IN (3,5)
    AND FieldID IN (10201,10677)
    AND year = 2002
)  SourceTable
PIVOT
(
    MAX(numeric)
    FOR FieldID IN ([10201],[10677])
) AS PivotTable
ORDER BY PivotTable.CountryID

Это возвращает что-то похожее на это:

CountryID СтранаGDPPerCapita LifeExpTotal

3 35985,78 77,24

5 9147,7 74,54

Тогда у меня есть еще один запрос:

SELECT CountryName, CountryGDP, CountryGDPGrowth 
FROM globaledge.dbo.Country_Statistics 
WHERE CountryID IN (3,5) 
AND year=2002
Order By CountryName

Который производит следующее:

CountryName CountryGDP СтранаGDPGrowth

Мексика 1567000000000000 1,3

США 14440000000000000 0,4

Также обратите внимание, у меня есть CountryID в обеих таблицах, которые относятся к одной и той же стране. Я хочу создать один SQL-запрос, возможно, с INNER JOIN, который будет возвращать следующее:

СтранаНазвание СтранаGDP СтранаGDPРост страныGDPPerCapita LifeExpTotal

Мексика 156700000000000000 1,3 35985,78 77,24

США 144400000000000000 0,4 9147,7 74,54

Может ли кто-нибудь помочь мне сделать этот запрос? или скажите, если это возможно?

1 Ответ

11 голосов
/ 20 февраля 2010

Примерно так будет работать:

SELECT 
  a.CountryID, a.CountryName, a.CountryGDP, a.CountryGDPGrowth 
, b.CountryGDPPerCapita, b.LifeExpTotal
FROM
(
    SELECT CountryID, CountryName, CountryGDP, CountryGDPGrowth 
    FROM globaledge.dbo.Country_Statistics 
    WHERE CountryID IN (3,5) 
    AND year=2002
) AS a
JOIN 
(
    SELECT CountryID, [10201] AS CountryGDPPerCapita, [10677] AS LifeExpTotal
    FROM
    (
        SELECT CountryID,FieldID,numeric 
        FROM globaledge.dbo.DIBS_Data
        WHERE CountryID IN (3,5)
        AND FieldID IN (10201,10677)
        AND year = 2002
    )  SourceTable
    PIVOT
    (
        MAX(numeric)
        FOR FieldID IN ([10201],[10677])
    ) AS PivotTable
) AS b ON a.CountryID = b.CountryID
Order By a.CountryName
...