MySQL вычисляет коэффициенты на основе результата группового запроса

ДОБАВИТЬ:

SQL-запрос:

SELECT s.name
     , d.feeling
     , COUNT(1) AS times 
  FROM data_table d
     , staff s 
 WHERE d.nid = s.id 
   AND d.project_id = 1 
   AND d.crawl_time BETWEEN '2018-10-17' AND '2018-10-24' 
   AND LENGTH(TRIM(d.feeling)) > 0 
 GROUP 
    BY d.nid
     , d.feeling

ДОБАВИТЬ (КОНЕЦ)

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

-- a certain sql returns, not an existing table --    
`name`  `feeling`   `times`  (expect)
Jack     happy        10       0.45
Jack     sad          7        0.31
Jack     common       5        0.22
Lily     happy        3        0.27
Lily     sad          6        0.54
Lily     common       2        0.18
Sam      happy        6        0.42
Sam      sad          7        0.5
Sam      common       1        0.07

Теперь цель - вычислить соотношение чувств каждого. Например, счастливое чувство Джека берет из его чувств 10/(10+7+5), а за грустное чувство - 7/(10+7+5). При использовании SUM(result.count) и GROUP BY name для рисования грустные или обычные чувства не проявляются. Затем я использую подзапрос, но таблица не существует. Есть ли способ работать без создания представления?

Вы тоже можете включить свой запрос?

dwir182 25.10.2018 04:53

Вы тоже можете включить свой запрос?

Tim Biegeleisen 25.10.2018 05:19

Ставлю запрос вверху.

code-life balance 25.10.2018 05:31

Я отредактировал сообщение и опустил неофициальные слова. Извините за неприличие. @Клубника

code-life balance 25.10.2018 11:06
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
4
354
1

Ответы 1

Одно решение, которое должно работать с любой версией MySQL, использует подзапрос, чтобы найти сумму times для каждого имени, а затем присоединяется к нему:

SELECT
    t1.name,
    t1.feeling,
    t1.times,
    t1.times / t2.times_sum AS feeling_ratio
FROM yourTable t1
INNER JOIN
(
    SELECT name, SUM(times) AS times_sum
    FROM yourTable
    GROUP BY name
) t2
    ON t1.name = t2.name;

Если вы используете MySQL 8+ или новее и имеете доступ к аналитическим функциям, то есть более простой способ написать это:

SELECT
    t1.name,
    t1.feeling,
    t1.times,
    t1.times / SUM(t1.times) OVER (PARTITION BY t1.name) AS feeling_ratio
FROM yourTable t1;

Боюсь, что упомянутая вами таблица yourTable не существует, это представление (результат запроса), а не таблица.

code-life balance 25.10.2018 04:58

Это не имеет значения. Просто замените yourTable на yourView, и тогда запрос должен работать.

Tim Biegeleisen 25.10.2018 04:58

Простите, вы имеете в виду, что я должен заменить дважды? Только что я попробовал заменить первый t1, но не заменил второй. Произошла ошибка: таблица t1 не существует. @Tim Biegeleisen

code-life balance 25.10.2018 05:19

Другие вопросы по теме