SQL Группировка по функции STUFF - PullRequest
0 голосов
/ 23 января 2020

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

SELECT alertQueue.[Prod No] AS ProdNumber
        , SUBSTRING(alertQueue.[Prod No], PATINDEX('%[^0]%', alertQueue.[Prod No] +'.'), LEN(alertQueue.[Prod No])) AS ProducerNumber
        , alertQueue.[Tank No] AS TankNo
        , alertQueue.[Sequence_Number] AS SeqNumber
        , alertQueue.[Notification_Account] AS NotificationAccount
        , alertQueue.[Login] AS [Login]
        , alertQueue.[Manifest_Number] AS ManifestNumber
        , prod.[Prod Div] AS Division
        , prod.[Prod Name] AS Name
        , alertQueue.[Notification_Type] AS NotificationType
        , alertQueue.[Pickup_Date] AS PickupDate
        , STUFF((SELECT CASE alertQueue.[Notification_Type]
                        WHEN 'Phone'
                        THEN '  <br/> ' + nestedAlertQueue.[Test_Name] + ':' + CAST(nestedAlertQueue.[Test_Value] AS varchar(MAX)) 
                        WHEN 'Email'
                        THEN '  <br/> ' + nestedAlertQueue.[Test_Name] + ' is ' + CAST(nestedAlertQueue.[Test_Value] AS varchar(MAX)) 
                            + CASE nestedAlertQueue.[Test_Name]
                                WHEN 'BF'   THEN ' ( ' + alertQueue.Threshold + ' ' + alertQueue.Threshold_Value + ' )' 
                                WHEN 'LPC'  THEN ' ( ' + alertQueue.Threshold + ' ' + alertQueue.Threshold_Value + ' )' 
                                WHEN 'MUN'  THEN ' ( ' + alertQueue.Threshold + ' ' + alertQueue.Threshold_Value + ' )' 
                                WHEN 'PIC'  THEN ' ( ' + alertQueue.Threshold + ' ' + alertQueue.Threshold_Value + ' )' 
                                WHEN 'PRO'  THEN ' ( ' + alertQueue.Threshold + ' ' + alertQueue.Threshold_Value + ' )' 
                                WHEN 'SCC'  THEN ' ( ' + alertQueue.Threshold + ' ' + alertQueue.Threshold_Value + ' )' 
                                ELSE ''
                                END
                        ELSE ''
                        END
                    FROM [LIBECIRTP].[API].[Test_Alert_Queue] (NOLOCK) AS nestedAlertQueue
                    INNER JOIN [LIBECIRTP].[report].[Producer] (NOLOCK) AS nestedProducer
                        ON nestedProducer.[Prod No KEY] = nestedAlertQueue.[Prod No]
                    WHERE nestedAlertQueue.[Prod No] = alertQueue.[Prod No]
                    AND nestedAlertQueue.[Tank No] = alertQueue.[Tank No]
                    AND nestedAlertQueue.[Sequence_Number] = alertQueue.[Sequence_Number]
                    AND nestedAlertQueue.[Notification_Account] = alertQueue.[Notification_Account]
                    AND nestedAlertQueue.[Login] = alertQueue.[Login]
                    FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)') ,1,2,'') AS TestDetails
    FROM  [LIBECIRTP].[API].[Test_Alert_Queue] (NOLOCK) AS alertQueue
    INNER JOIN [LIBECIRTP].[report].[Producer] (NOLOCK) AS prod
            ON prod.[Prod No KEY] = alertQueue.[Prod No]
    WHERE alertQueue.[Notification_Type] = 'Email'
    GROUP BY  alertQueue.[Prod No]
            , alertQueue.[Tank No]
            , alertQueue.[Sequence_Number]
            , alertQueue.[Notification_Account]
            , alertQueue.[Login]
            , alertQueue.[Manifest_Number]
            , prod.[Prod Div]
            , prod.[Prod Name]
            , alertQueue.[Notification_Type]
            , alertQueue.[Pickup_Date]
    ORDER BY alertQueue.[Prod No]
            , alertQueue.[Notification_Account]
            , alertQueue.[Login] ASC

Но когда я запускаю этот запрос, я получаю сообщение об ошибке, в котором говорится:

Сообщение 8120, уровень 16, состояние 1, строка 18 столбца 'LIBECIRTP.API.Test_Alert_Queue. Порог 'недопустим в списке выбора, потому что он не содержится ни в статистической функции, ни в предложении GROUP BY.

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

Итак, если alertQueue. [Notification_Type] = 'Phone', то не должно быть alertQueue. [Threshold] и alertQueue. [Threshold_Value], а если alertQueue. [Notification_Type] = 'Email', должно быть alertQueue . [Threshold] и alertQueue. [Threshold_Value] в SELECT и GROUP BY.

Может кто-нибудь из вас, пожалуйста, помогите мне с этим. Я действительно ценю любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...