2015-02-03 3 views
0

Может ли кто-нибудь помочь мне? Пример: Проблема, с которой я сталкиваюсь, - это когда учетная запись имеет AV.Query = 'PN4', AV.Response = 'Y', AV.Query = 'FL1' и AV.Response = 'Y', результат должен бытьSQL CASE Logic Issue

PStatus IStatus 
4   2 

Однако я получаю

PStatus IStatus 
4   5 
5   2 

Он выбирает «5» все время на противоположной колонке.

SELECT distinct A.AcctNum, 
     CASE 
     WHEN O.Order = 'NEI2' THEN '1' 
     WHEN AV.Query IN ('PNE1','PNE2') AND AV.Response = 'Y' THEN '2' 
     WHEN AV.Query = 'PN20' AND AV.Response = 'Y' THEN '3' 
     WHEN AV.Query = 'PN4' AND AV.Response = 'Y' THEN '4' 
     ELSE '5' 
     END AS [PStatus], 

    CASE 
     WHEN O.Order IN ('DO2','FL25','VACHP') THEN '1' 
     WHEN AV.Query = 'FL1' AND AV.Response = 'Y' THEN '2' 
      WHEN AV.Query = 'REF' AND AV.Response = 'Y' THEN '3' 
     WHEN AV.Query IN ('FL2','FL6','NEU.G','HE.B') AND AV.Response = 'Y' THEN '4' 
     WHEN AV.Query = 'NOA' AND AV.Response = 'Y' THEN '6' 
    ELSE '5' 
    END AS [IStatus] 

FROM AData AS AD 

     INNER JOIN AVisit AS AV 
     ON AD.Visit = AV.Visit 
     AND AV.QueryID IN ('PNE1','PNE2','PN20','PN4','FL1','REF','FL2','FL6','NEU.G','HE.B','NOA') 

     LEFT JOIN Order AS O 
    ON AD.Visit = O.Visit 
     AND O.Order IN ('NEI2','DO2','FL25','VACHP'); 
+0

Можете ли вы установить скрипт sql с вашими данными, поскольку его очень сложно проанализировать без данных? – DevelopmentIsMyPassion

+0

Что такое sql скрипка? Спасибо. – Bulbul

+0

Перейдите на этот сайт и создайте таблицу и вставьте данные. Когда закончите, дайте нам URL-адрес http://www.sqlfiddle.com/ – DevelopmentIsMyPassion

ответ

3

Результаты поиска верны для запроса.

Рассмотрим сначала ряд объединения, который имеет

AV.Query = 'PN4', AV.Response = 'Y',

Это соответствует последним WHEN условию в CASE выражение для [PStatus], но оно не соответствует ни одному из условий WHEN в выражении CASE для [IStatus]. Результат:

4 5 

Рассмотрим теперь присоединиться ряд имеет

AV.Query = 'FL1' и AV.Response = 'Y'

Это не соответствует ни одному WHEN условию выражение CASE для [PStatus], но оно соответствует второму состоянию WHEN условий в выражении CASE для [IStatus]. Результат:

5 2 

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

UPDATE:

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

SELECT 
    AcctNum, 
    MIN(
    CASE 
     WHEN O.Order = 'NEI2' THEN '1' 
     WHEN AV.Query IN ('PNE1','PNE2') AND AV.Response = 'Y' THEN '2' 
     WHEN AV.Query = 'PN20' AND AV.Response = 'Y' THEN '3' 
     WHEN AV.Query = 'PN4' AND AV.Response = 'Y' THEN '4' 
     ELSE NULL 
    END 
) AS [Pstatus], 
    MIN(
    CASE 
     WHEN O.Order IN ('DO2','FL25','VACHP') THEN '1' 
     WHEN AV.Query = 'FL1' AND AV.Response = 'Y' THEN '2' 
     WHEN AV.Query = 'REF' AND AV.Response = 'Y' THEN '3' 
     WHEN AV.Query IN ('FL2','FL6','NEU.G','HE.B') AND AV.Response = 'Y' THEN '4' 
     WHEN AV.Query = 'NOA' AND AV.Response = 'Y' THEN '6' 
     ELSE NULL 
    END 
) AS [IStatus] 
FROM 
    AData AS AD 
    INNER JOIN AVisit AS AV 
    ON AD.Visit = AV.Visit 
     AND AV.QueryID IN ('PNE1','PNE2','PN20','PN4','FL1','REF','FL2','FL6','NEU.G','HE.B','NOA') 

    LEFT JOIN Order AS O 
    ON AD.Visit = O.Visit 
     AND O.Order IN ('NEI2','DO2','FL25','VACHP'); 
GROUP BY AcctNum 

Это работает, потому что кроме COUNT() агрегатных функций игнорируют NULL с. Однако, скорее всего, он не даст желаемого ответа для разных шаблонов данных - особенно в тех случаях, когда для одной учетной записи имеется более двух AVisit.

+0

Точно Джон, так как я могу это исправить? Любая альтернатива будет работать до тех пор, пока я получу правильный результат, и я не получаю «5» все время. – Bulbul

+0

Каждый запрос имеет ответ «Y» или «N». Мне нужны только запросы с ответом «Y». Эта примерная учетная запись имела AV.Query = 'PN4' и AV.Query = 'FL1' с ответом «Y». Результат должен быть только 4 2. – Bulbul

+0

Вы вычисляете два отдельных столбца результата, назначая метки 'PStatus' и' IStatus'. Ты хочешь сказать, что хочешь только одного? –

1

Результаты верны.

Ваши значения:

Первый ряд - AV.Query='PN4', AV.Response = 'Y' Второй ряд - AV.Query='FL1', AV.Response='Y'

Первый случай PStatus: Результат 4, как вы ожидали.

Next Case, Istatus. Вероятно, это ложное недоразумение, потому что SQL будет обрабатывать все те же значения (первая строка). Это CASE будет проверять на значения: AV.Query='PN4', AV.Response = 'Y' с первой строки. Не против ваших вторых значений (AV.Query='FL1' and AV.Response='Y').

Значения 'PN4' and 'FL1' не могут быть в одном столбце в одной строке! Один столбец может иметь только одно значение, а не два. Вероятно, вы ожидаете, что в этом втором случае SQL начнет получать другую (вторую) строку данных. Но это не так.

Второй результат случай является правильным Потому что в случае не условие для значения PN4, так что в конечном итоге, как ELSE = 5


OK Edit, сделать это так, это перебор, но будет работать ;-)

SELECT A.AcctNum, 
    COALESCE(MAX(CASE 
     WHEN O.Order = 'NEI2' THEN '1' 
     WHEN AV.Query IN ('PNE1','PNE2') AND AV.Response = 'Y' THEN '2' 
     WHEN AV.Query = 'PN20' AND AV.Response = 'Y' THEN '3' 
     WHEN AV.Query = 'PN4' AND AV.Response = 'Y' THEN '4' 
     ELSE NULL 
     END),5) AS [PStatus], 

    COALESCE(MAX(CASE 
     WHEN O.Order IN ('DO2','FL25','VACHP') THEN '1' 
     WHEN AV.Query = 'FL1' AND AV.Response = 'Y' THEN '2' 
     WHEN AV.Query = 'REF' AND AV.Response = 'Y' THEN '3' 
     WHEN AV.Query IN ('FL2','FL6','NEU.G','HE.B') AND AV.Response = 'Y' THEN '4' 
     WHEN AV.Query = 'NOA' AND AV.Response = 'Y' THEN '6' 
    ELSE NULL 
    END),5) AS [IStatus] 
+0

Да, я понимаю проблему. Но как я могу это исправить? Любое предложение или код, который вы можете ввести для меня? Спасибо. – Bulbul

+0

Для одной учетной записи у меня есть «FL1», «DO2» и «NEI2», поэтому я ожидал 1,1 и 5,4, но только дал мне 1,4, используя «MAX» (ваш запрос). Используя «MIN» (запрос Джона выше), я получил 1,1. Правильный ответ должен быть 1,4 и 5,1 или 1,1 и 5,4. – Bulbul

+0

Хм, дают нам все исходные данные для конкретного счета, используйте ниже запроса: 'SELECT * FROM ADATA AS AD INNER JOIN AVisit AS AV ON AD.Visit = AV.Visit И AV.QueryID IN ('PNE1 ', PNE2', 'PN20', 'PN4', 'FL1', 'REF', 'FL2', 'FL6', 'NEU.G', 'HE.B', 'NOA') LEFT JOIN Заказать AS O ON AD.Visit = O.Visit И O.Order IN ('NEI2', 'DO2', 'FL25', 'VACHP') WHERE AcctNum = '' * insert_the_accunt_which_cusing_trouble * ''' –