Ошибка получения неизвестного столбца при выборе данных для производной таблицы - PullRequest
0 голосов
/ 30 января 2019

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

Records_table--------------       Name_table---------
Ref    Score     Iteration        Ref      NName
1      High      1                1        Falcon
1      Middle    2                2        Willow
2      Middle    1                3        Lance
2      Middle    2                4        Ranger
2      Low       3
3      Low       1
4      High      1
4      High      2
4      High      3

Требуется вывод:

NName      High  Middle  Low
Falcon     1     1       0
Willow     0     2       1
Lance      0     0       1
Ranger     3     0       0

Это то, что у меня есть: (Отредактировано, как я заметил, я оставил в поле SELECT («Ссылка»), которое я удалил в своей версии)

SELECT 
    tc.nname AS NName, 
    COUNT(High) High,
    COUNT(Middle) Middle,
    COUNT(Low) Low
FROM
    (SELECT 
        NName, 'High' High, NULL Middle, NULL Low
    FROM
        records_table tr
        JOIN name_table tc ON tc.ref = tr.ref
    WHERE
        tr.score = 'High'
    UNION ALL 
    SELECT 
       NName, NULL, 'Middle', NULL
   FROM
       records_table tr
        JOIN name_table tc ON tc.ref = tr.ref
   WHERE
       tr.score = 'Middle'
    UNION ALL
    SELECT 
       NName, NULL, NULL, 'Low'
   FROM
       records_table tr
        JOIN name_table tc ON tc.ref = tr.ref
   WHERE
       tr.score = 'Low' ) T 
GROUP BY NName;

Это происходит с ошибкой «ОШИБКА 1054 (42S22): неизвестный столбец« NName »в« списке полей »»

Что я сделал не так и что мне нужно, чтобы эта работа работала

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Хотя это не совсем то, что задает вопрос (и это закрытый вопрос, на который @scaisEdge дал правильный ответ), я не думаю, что объединение - лучший способ пойти сюда.Рассмотрим условную агрегацию

select n.ref,n.nname,
          sum(case when score = 'high' then 1 else 0 end) High,
          sum(case when score = 'middle' then 1 else 0 end) middle,
          sum(case when score = 'low' then 1 else 0 end) low
from n 
join r on r.ref = n.ref
group by n.ref,n.nname;

+------+--------+------+--------+------+
| ref  | nname  | High | middle | low  |
+------+--------+------+--------+------+
|    1 | Falcon |    1 |      1 |    0 |
|    2 | Willow |    0 |      2 |    1 |
|    3 | Lance  |    0 |      0 |    1 |
|    4 | Ranger |    3 |      0 |    0 |
+------+--------+------+--------+------+
4 rows in set (0.00 sec)
0 голосов
/ 30 января 2019

Ваш псевдоним таблицы - T, а не tc, поэтому вы должны использовать T.nname в главном select

    SELECT 
            T.`NNAME` AS NName, 
            COUNT(High) High,
            COUNT(Middle) Middle,
            COUNT(Low) Low
    FROM  ( 
        SELECT 
                Ref,`NNAME`, 'High' High, NULL Middle, NULL Low
        FROM  records_table tr
        JOIN name_table tc ON tc.ref = tr.ref
        WHERE tr.score = 'High'
        UNION ALL 
        SELECT 
               Ref,`NNAME`, NULL, 'Middle', NULL
        FROM records_table tr
        JOIN name_table tc ON tc.ref = tr.ref
        WHERE tr.score = 'Middle'
        UNION ALL
        SELECT 
               Ref,`NNAME`, NULL, NULL, 'Low'
        FROM records_table tr
        JOIN name_table tc ON tc.ref = tr.ref
        WHERE tr.score = 'Low' 
    ) T 
    GROUP BY T.`NNAME`;
...