«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как я могу точно свести данные с разными записями, чтобы избежать потери информации?

Как я могу точно свести данные с разными записями, чтобы избежать потери информации?

Опубликовано 27 декабря 2024 г.
Просматривать:511

How Can I Accurately Pivot Data with Distinct Records to Avoid Losing Information?

Эффективное сведение отдельных записей

Сводные запросы играют решающую роль в преобразовании данных в табличный формат, обеспечивая легкий анализ данных. Однако при работе с отдельными записями поведение сводных запросов по умолчанию может стать проблематичным.

Проблема: игнорирование отдельных значений

Рассмотрите следующую таблицу:

------------------------------------------------------
| 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