У меня есть один вопрос в 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.
Может кто-нибудь из вас, пожалуйста, помогите мне с этим. Я действительно ценю любую помощь.