Представление MySQL — вычисляемый столбец из нескольких таблиц, возвращающий значение NULL

#mysql #join #group-by #calculated-columns #sql-view

#mysql #Присоединиться #группировать по #вычисляемые столбцы #sql-представление

Вопрос:

Предположим, у меня есть две таблицы. Таблица T1 , подобная:

 Game Player Points Assists
 1     1     10     5
 1     2     5      10
  

T2 Нравится:

 Game Player Fouls Turnovers
1      1     5       5
1      2     10      10
  

Я хотел бы создать представление с одной строкой на игрока и новым полем, rating где rating равнозначная сумма Points, Assists, Fouls,Turnovers для каждого игрока. (т. е. рейтинг = .25 * Очки .25 * Передачи .25 * Фолы .25 * Обороты)

Я создаю представление:

 CREATE VIEW `player_view` AS (
SELECT Player,
  SUM( 
  Points *0.25  
  Assists *0.25  
  Fouls *0.25  
  Turnovers *0.25) AS Rating)
FROM T1 INNER JOIN T2 ON
  T1.Player = T2.Player
AND T1.Game = T2.Game
GROUP BY Player
  

Но вместо того, чтобы возвращать значение, я получаю NULL для всех Rating :

 Player Rating
1       NULL
2       NULL
  

Изначально я столкнулся с

Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'support_desk.mod_users_groups.group_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Итак, я отключил only_full_group_by через SET sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

Итак, теперь, хотя представление возвращает набор результатов, Ratings все они равны НУЛЮ. Пожалуйста, помогите.

Ответ №1:

Кажется, вы пропустили оператор между столбцом в сумме, например, может быть, у вас есть какой-то скрытый символ в ключевых полях, так что .. попробуйте trim ()

 CREATE VIEW `player_view` AS 
SELECT Player,
  SUM( 
  t1.Points*0.25   
  t1.Assists*0.25   
  t2.Fouls*0.25   
  t2.Turnovers*0.25) AS Rating
  )
FROM T1 
INNER JOIN T2 ON
  trim(T1.Player) = trim(T2.Player)
    AND trim(T1.Game) = trim(T2.Game);
GROUP BY Player

select * from player_view;
  

Комментарии:

1. вы правы, я написал пример в спешке. Мой реальный запрос с реальными таблицами содержит операторы. Я исправлю это в первом сообщении.

2. обновление ответа с использованием trim .. и вы кричите восстановить полное предложение group by