Эффективное сведение отдельных записей
Сводные запросы играют решающую роль в преобразовании данных в табличный формат, обеспечивая легкий анализ данных. Однако при работе с отдельными записями поведение сводных запросов по умолчанию может стать проблематичным.
Проблема: игнорирование отдельных значений
Рассмотрите следующую таблицу:
------------------------------------------------------ | Id Code percentage name name1 activity | ----------------------------------------------------- | 1 Prashant 43.43 James James_ Running | | 1 Prashant 70.43 Sam Sam_ Cooking | | 1 Prashant 90.34 Lisa Lisa_ Walking | | 1 Prashant 0.00 James James_ Stealing | | 1 Prashant 0.00 James James_ Lacking | | 1 Prashant 73 Sam Sam_ Cooking 1 | ------------------------------------------------------
Традиционный сводный запрос, например:
SELECT Id,Code, MAX(CASE WHEN name = 'James' THEN activity END) AS James, MAX(CASE WHEN name1 = 'James_' THEN percentage END) AS James_, MAX(CASE WHEN name = 'Sam' THEN activity END) AS Sam, MAX(CASE WHEN name1 = 'Sam_' THEN percentage END) AS Sam_, MAX(CASE WHEN name = 'Lisa' THEN activity END) AS Lisa, MAX(CASE WHEN name1 = 'Lisa_' THEN percentage END) AS Lisa_ FROM A GROUP BY Id, Code
приведет к следующей таблице:
------------------------------------------------------------------- Id Code James James_ Sam Sam_ Lisa Lisa_ ------------------------------------------------------------------- 1 Prashant Running 43.43 Cooking 3.43 Walking 90.34 1 Prashant Stealing 0.0 NULL NULL NULL NULL -------------------------------------------------------------------
Проблема здесь в том, что сводный запрос игнорирует отдельные значения для name1, когда имя повторяется, а процент равен 0. В этом случае «Недостаточное» действие для Джеймса потеряно.
Решение: использование ROW_NUMBER() для точности
Чтобы решить эту проблему, мы можем ввести ROW_NUMBER():
;with cte as ( select *, ROW_NUMBER() over (partition by name order by percentage desc) ROWNUM from A ) ...
Используя ROW_NUMBER(), мы разделяем данные на основе имени и присваиваем каждой строке уникальный номер в этом разделе. Это позволяет нам сохранять связь между действиями и процентами, даже если имя повторяется.
Результирующая таблица будет следующей:
---------------------------------------------------------- | Id Code James James_ Sam Sam_ Lisa Lisa_ ---------------------------------------------------------- | 1 Prashant Running 43.43 Cooking 1 73 Walking 90.34 | 1 Prashant Stealing 0.00 Cooking 3.43 NULL NULL | 1 Prashant Lacking 0.00 NULL NULL NULL NULL ----------------------------------------------------------
Все действия, включая «Недостаток» для Джеймса, теперь представлены в сводной таблице. Этот метод гарантирует сохранение отдельных значений, предоставляя точные данные для анализа.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3