Упрощение нелепо вложенного подзапроса в SQL при выполнении вычислений - PullRequest
0 голосов
/ 13 марта 2019

Это в MySQL.Я создал следующий запрос, который возвращает желаемый ответ, но выглядит адски (и, вероятно, медленнее, чем мог бы быть).Есть ли способ упростить это?

select  Status
,       count(d.FruitType) as Count
,       (select count(distinct FruitType) from Fruits) as TotalTypesOfFruit
from    (select c.FruitType
        ,       case
                    when sum(c.Eaten) > 4 then 'Popular'
                    else 'Not Popular'
                end as Status
        from    (select a.*
                ,       b.PieceID
                ,       b.Size
                ,       case
                            when b.Size > a.AvgSize then 1
                            else 0
                        end as Eaten
                from    Fruits a
                left join   Fruit_Pieces b
                on  a.FruitType = b.FruitType) c
        group by c.FruitType) d
group by Status;
  • Фрукты имеют список типов фруктов (FruitType) и их средний размер (AvgSize).
  • Fruit_Pieces имеет список отдельных кусочков фруктов (PieceID), каждый из которых имеет FruitType и размер.
  • Если размер каждого кусочка фрукта превышает AvgSize для его FruitType,тогда фрукты едят.
  • Если съедено более 4 кусочков фруктов FruitType, то этот FruitType имеет статус «Популярный» (иначе «Не популярный»).
  • Я хочу рассчитать количество "популярных" и "не популярных" FruitTypes, а также общее количество FruitTypes.

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


РЕДАКТИРОВАТЬ:

Я упростил его до сих пор:

select  Status
,       count(c.FruitType) as Count
,       (select count(distinct FruitType) from Fruits) as TotalTypesOfFruit
from    (select a.FruitType
        ,       case
                    when sum(
                            case
                                b.Size > a.AvgSize then 1
                            else 0
                            end) > 4 then 'Popular'
                else 'Not Popular'
                end as Status
        from    Fruits a
        left join   Fruit_Pieces b
        on  a.FruitType = b.FruitType
        group by a.FruitType) c
group by Status
order by Status

Что все еще кажется не идеальным.Он более читабелен, но, кажется, не быстрее.

...