Замена в предложении с существует - PullRequest
0 голосов
/ 15 ноября 2010

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

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

Список определен так:

select 
f.id
FROM _audit a
INNER JOIN _fund f ON a.article_id = f.id
WHERE a.entity_name = 'Fund'
AND a.Changes LIKE 
'%finance_code2%OldValue>3%'
)
UNION
(
select 
id AS fund_reference
FROM _fund
WHERE (finance_code2 LIKE '3%'
OR finance_code2 LIKE '9%')
AND finance_code2 IS NOT NULL

И то, что я ищу, - это что-то вроде:

SELECT
...Main query here...
,CASE WHEN fund_id IN (list_details) THEN 'emergency' else 'non-emergency' end

Я знаю, что было бы эффективнее сделать что-то вроде

SELECT
...Main query here...
,SELECT CASE WHEN EXISTS
(SELECT fund_id FROM list_details WHERE fund_id IS NOT NULL) THEN 'emergency' else 'non-emergency' END

Но каждый раз, когда я пытаюсь, он возвращает ложные значения (говоря, что средства содержатся в списке, а их нет)

В случае, если это помогает, я использую sql server 2005, и основной запрос приведен ниже, где результат list_details (id) объединен с donation_fund_allocation в list_details.id = donation_fund_allocation.fund_id

Как всегда, любая подсказка была бы очень полезна :) Спасибо!

Основной запрос

SELECT
don.supporter_id AS contact_id
,don.id AS gift_id
,YEAR(don.date_received) AS calendar_year
,YEAR(don.date_received) - CASE WHEN MONTH(don.date_received) < 4 THEN 1 ELSE 0 END AS financial_year
,don.date_received AS date_received
,don.event_id AS event_id
,SUM(CASE   WHEN don.gift_aid_status <> 4 THEN don.value_gross * ((dfa.percentage) / 100)
            WHEN don.gift_aid_status = 4 AND don.value_net > don.value_gross
            AND don.value_net <> 0       THEN don.value_net  * ((dfa.percentage) / 100)
            ELSE don.value_gross  * ((dfa.percentage) / 100)
            END
        )   AS donation_value
--**List details query to go in here**
FROM donation don WITH (nolock)
INNER JOIN donation_fund_allocation dfa WITH (nolock) ON dfa.donation_id = don.id
WHERE don.supporter_id IS NOT NULL
AND don.status = 4 
AND don.value_gross <> 0
GROUP BY don.supporter_id
,don.id
,don.date_received
,don.event_id

Ответы [ 2 ]

1 голос
/ 15 ноября 2010

Вам необходимо сопоставить существующий вызов с внешним запросом. Как написано, вы просто спрашиваете, существуют ли какие-либо строки в list_details, где fund_id не является нулевым

Итак, что вы на самом деле хотите, это

SELECT
...Main query here...
,SELECT CASE WHEN EXISTS
(SELECT 1 FROM list_details WHERE fund_id = outer.fund_id) THEN 'emergency' else 'non-emergency' END

Где outer - псевдоним таблицы, где fund_id можно найти в вашем основном select

0 голосов
/ 15 ноября 2010

Вы можете написать функцию, которая принимает fund_id и возвращает соответствующее строковое значение «чрезвычайный» или «не аварийный».

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