SQL-запрос для определения неравных значений и представления в формате транспонирования - PullRequest
0 голосов
/ 15 октября 2019

У нас есть таблица CountryDtls, в которой указаны название страны, выполненные действия и год. Мне нужно идентифицировать только те строки, в которых значения года различаются для разных школ и академий, и представить их в другом формате, как показано ниже

Исходный список:

Year  |CountryName |Activity  |
------|------------|----------|
1987  |India       |Arts      |
1987  |India       |Science   |
1876  |India       |Academy   |
1876  |Aus         |Arts      |
1836  |Aus         |Science   |
1876  |Aus         |Academy   |
1976  |USA         |Arts      |
1976  |USA         |Science   |
1976  |USA         |Academy   |

Ожидаемый результат:

CountryName |Arts |Academy |
------------|-----|--------|
India       |1987 |1876    |

Я могу добиться результатов, используя приведенный ниже запрос. Есть ли лучший способ достижения желаемого результата?

select c.CountryName,(select Year from CountryDtls where environment="Arts" and c.CountryName=CountryName ) AS Arts 
,(select Year from CountryDtls where environment="Academy" and c.CountryName=CountryName ) as Academy from CountryDtls c where environment="Arts" AND environment="Arts" AND (CountryName) IN (SELECT CountryName FROM CountryDtls where environment="Academy") AND (Year) NOT IN (Select Year FROM CountryDtls where environment="Academy")

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Например:

SELECT countryname
     , MAX(CASE WHEN activity = 'arts' THEN year END) arts
     , MAX(CASE WHEN activity = 'academy' THEN year END) academy 
  FROM my_table 
 GROUP 
    BY countryname 
HAVING arts <> academy;

или ...

SELECT x.countryname
     , x.year arts
     , y.year academy 
  FROM my_table x 
  JOIN my_table y 
    ON y.countryname = x.countryname 
   AND y.year <> x.year 
   AND y.activity = 'academy' 
 WHERE x.activity = 'arts';
0 голосов
/ 15 октября 2019

Я думаю, что самостоятельное объединение (с использованием подзапросов) обеспечивает самое ясное решение:

SELECT
    Arts.CountryName,
    Arts.Yr AS Arts,
    Academy.Yr AS Academy
FROM
    (
        SELECT Yr, CountryName, Activity 
        FROM CountryDtls WHERE Activity = 'Arts'
    ) AS Arts
    INNER JOIN 
    (
        SELECT Yr, CountryName, Activity
        FROM CountryDtls WHERE Activity = 'Academy'
    ) AS Academy ON
        Academy.CountryName = Arts.CountryName
WHERE Arts.Yr <> Academy.Yr

Если у вас MySQL ≥ 8.0, вы можете использовать CTE, чтобы сделать его немного более читабельным:

WITH 
    Arts AS
    (
        SELECT yr, CountryName, Activity
        FROM CountryDtls WHERE Activity = 'Arts'
    ),
    Academy AS
    (
        SELECT yr, CountryName, Activity
        FROM CountryDtls WHERE Activity = 'Academy'
    )
SELECT
    Arts.CountryName,
    Arts.Yr AS Arts,
    Academy.Yr AS Academy
FROM Arts INNER JOIN Academy ON Academy.CountryName = Arts.CountryName
WHERE Arts.Yr <> Academy.Yr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...