SQL Pivot для использования в представлении

Я пытаюсь создать представление, которое суммирует общее количество часов различных типов работы, а также количество различных продуктов, используемых для RefNumber.

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

Образец данных

Скачать Excel данных

Имейте в виду, что на некоторых RefNumber будет несколько записей одного и того же ProductID. Возможно, несколько человек использовали один и тот же продукт в разных количествах.

Вот что я тоже пытаюсь развернуть:

Сводные данные

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

SELECT RefNumber,
SUM (CASE WHEN WorkType = 'Blast' THEN THours ELSE NULL END) AS TBlast,
SUM (CASE WHEN WorkType = 'Wheel' THEN THours ELSE NULL End) As TWheel,
SUM (CASE WHEN WorkType = 'Painting' THEN THours ELSE NULL END) AS TPainter,
SUM (CASE WHEN WorkType = 'Mask/Prep' THEN Thours ELSE NULL END) As TMask,
SUM (CASE WHEN WorkType = 'Demask/Touch Up' THEN Thours ELSE NULL END) As TDMask,
SUM (CASE WHEN WorkType = 'Handling: Raw' THEN THours ELSE NULL END) As TRHand,
SUM (CASE WHEN WorkType = 'Handling: Product' THEN Thours ELSE NULL END) As TPHand,
SUM (CASE WHEN WorkType = 'Wheel:Assist' THEN Thours ELSE NULL END) As TAWheel,
SUM (CASE WHEN WorkType = 'Metalizing' THEN Thours ELSE NULL END) As TMetal


FROM (
SELECT [RefNumber], [WorkType], SUM (Hours)/60 As THours
  FROM [dbo].[Vw_Beta_CostLog]
  GROUP BY RefNumber, WorkType

) sub
GROUP BY RefNumber
ORDER BY RefNumber

Любые идеи о том, как изменить эту базу кода, чтобы переместить отдельные идентификаторы продукта в собственный столбец и суммировать использование этих продуктов во втором столбце?

Кроме того, я хочу использовать это как представление, поэтому я стараюсь избегать динамических поворотов.

Обновлено: Забыл упомянуть, что для каждого номера ссылки будет использоваться не более 4 уникальных продуктов.

НЕОБРАБОТАННЫЕ ДАННЫЕ

GUID        EmpName         RefNumber       DateInt     Hours   WorkType         ProductID  PQty
P-3468      Gary Hahn       114204      20181008            132 Painting                NULL    NULL
P-3473      Gary Hahn       114204      20181009            204 Painting                NULL    NULL
P-3475      Gary Hahn       114204      20181009            120 Painting                NULL    NULL
F-31915     Jose Flores     114204      20181007            60  Handling: Raw           NULL    NULL
F-31941     Jose Flores     114204      20181008            30  Handling: Raw           NULL    NULL
F-31951     Chris Pollock   114204      20181008            30  Handling: Raw           NULL    NULL
F-32076     Chris Pollock   114204      20181010            120 Handling: Product       NULL    NULL
F-32109     Chris Pollock   114204      20181011            90  Handling: Product       NULL    NULL
F-32301     Daryl Underwood 114204      20181015            15  Handling: Product       NULL    NULL
B-6594      David Martinez  114204      20181007            150 Blast                   NULL    NULL
B-6599      Emiliano Barrios 114204     20181008            66  Blast                   NULL    NULL
B-6617      Jose Molina     114204      20181009            30  Blast                   NULL    NULL
P-3468      Gary Hahn       114204      20181008        NULL    Primer                      11     3
P-3473      Gary Hahn       114204      20181009        NULL    Intermediate            890    2
P-3475      Gary Hahn       114204      20181009        NULL    Finish                  134HG  2

Результат, который я ищу

RefNumber   Blast   Painting    Handling: Raw   Handling: Product   Product1    P1Qty   Product2    P2Qty   Product3    P3Qty   
114204      246     456           120            225                    11          3          890  2         134HG            2    

Не могли бы вы предоставить данные формата вместо изображения? Благодарность

D-Shih 26.10.2018 20:38

Есть ли предпочтительный способ обмена образцами данных? Я просто собираюсь загрузить файл Excel в Dropbox, если вы не знаете лучшего способа.

Andrew 26.10.2018 20:59

В идеале вы должны предоставить свои образцы данных (простой случай подойдет) вместе с ожидаемым результатом, введенным в вопросе, вместо этих ссылок на изображения и другие веб-сайты, b / c некоторые из нас находятся в местах, где запрещены ссылки или изображения Dropbox. Тем не менее, показ вашей попытки запроса - это хорошо.

Zorkolot 26.10.2018 21:40

Если израсходовано 10 частей, вам нужно 20 столбцов? или, израсходовав 50 частей, вам нужно 100 колонок? В представлении должен быть фиксированный набор столбцов.

Paul Maxwell 27.10.2018 09:12

Будет использовано не более 4 продуктов, поэтому мне просто нужно преобразовать записи продуктов в общий Prod1 Prod2 Prod3, а затем просуммировать количество этих записей.

Andrew 30.10.2018 21:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
64
1

Ответы 1

Вы можете «повернуть» нечисловые данные, используя MAX() вместо SUM(), и продолжать использовать выражения case, как вы уже делаете.

SELECT
    RefNumber
    , SUM (CASE WHEN WorkType = 'Blast'             THEN Hours/60 ELSE NULL END) AS TBlast
    , SUM (CASE WHEN WorkType = 'Wheel'             THEN Hours/60 ELSE NULL End) As TWheel
    , SUM (CASE WHEN WorkType = 'Painting'          THEN Hours/60 ELSE NULL END) AS TPainter
    , SUM (CASE WHEN WorkType = 'Mask/Prep'         THEN Hours/60 ELSE NULL END) As TMask
    , SUM (CASE WHEN WorkType = 'Demask/Touch Up'   THEN Hours/60 ELSE NULL END) As TDMask
    , SUM (CASE WHEN WorkType = 'Handling: Raw'     THEN Hours/60 ELSE NULL END) As TRHand
    , SUM (CASE WHEN WorkType = 'Handling: Product' THEN Hours/60 ELSE NULL END) As TPHand
    , SUM (CASE WHEN WorkType = 'Wheel:Assist'      THEN Hours/60 ELSE NULL END) As TAWheel
    , SUM (CASE WHEN WorkType = 'Metalizing'        THEN Hours/60 ELSE NULL END) As TMetal
    , MAX (CASE WHEN rn = 1 THEN WorkType END)  As WorkType1
    , MAX (CASE WHEN rn = 1 THEN ProductID END) As Product1
    , MAX (CASE WHEN rn = 1 THEN PQty END)      As Qty1

    , MAX (CASE WHEN rn = 2 THEN WorkType END)  As WorkType2
    , MAX (CASE WHEN rn = 2 THEN ProductID END) As Product2
    , MAX (CASE WHEN rn = 2 THEN PQty END)      As Qty2

    , MAX (CASE WHEN rn = 3 THEN WorkType END)  As WorkType3
    , MAX (CASE WHEN rn = 3 THEN ProductID END) As Product3
    , MAX (CASE WHEN rn = 3 THEN PQty END)      As Qty3
FROM (
    SELECT
        [RefNumber]
      , [WorkType]
      , [ProductID]
      , Hours
      , PQty
      , ROW_NUMBER() OVER (PARTITION BY RefNumber, case when ProductID IS NULL then 0 else 1 end ORDER BY ProductID) rn
    FROM [Vw_Beta_CostLog]
) sub
GROUP BY
    RefNumber
ORDER BY
    RefNumber

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

см. онлайн-демонстрацию: https://rextester.com/SBQUP24417

Я пробовал ваше решение Used_BY и получаю недопустимые имена столбцов. Я изменил product_id на ProductID и Qty на PQty в соответствии с моей схемой, но он по-прежнему не работает. Я попытался добавить ProductID и PQty в подзапрос from, но затем получаю ошибки агрегирования.

Andrew 30.10.2018 19:01

запрос был изменен, попробуйте еще раз

Paul Maxwell 31.10.2018 00:45

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

Поддерживает ли / будет ли AKS распространение модулей по доменам обновления?
Поддерживает ли Azure Active Directory привязку одного пользователя к нескольким профилям, при этом каждый профиль принадлежит своим собственным группам?
Конфигурация службы приложений для шаблонов ARM - состояние гонки / несогласованное поведение
Политики подписки Azure
Интеллектуальное оповещение об аномалиях сбоя отсутствует в Application Insights
Войдите в Azure PowerShell с помощью Connect-AzureRmAccount в программе, запущенной в событии публикации публикации
В чем разница между RBAC для виртуальных машин и масштабируемыми наборами виртуальных машин?
Helm install stable / nginx-ingress приводит к ошибке «Ошибка: не удалось выпустить unrealized-labradoodle: clusterroles.rbac.authorization.k8s.io»
Могут ли секреты объектов, созданных в шаблонах ARM, автоматически добавляться в Key Vault
Фатальный: протокол https не поддерживается в Git