2013-07-27 2 views
1

Это дает мне список пользователей, которые использовали внешнее финансирование.SELECT противоположный набор строк сложного запроса

SELECT 
    table_user.user as user, 
    sum(table_deposit.amount) as TotalExternalDeposits,payby,pro_id 
FROM table_deposit inner join table_user on table_deposit.user = table_user.user 
WHERE table_deposit.pro_id <> 'Cash A/C' 
AND table_deposit.batch NOT LIKE '%adj%' 
AND table_deposit.batch NOT LIKE 'Xmas%' 
AND table_deposit.batch NOT LIKE 'X-mas%' 
group by table_user.user 
order by table_user.user 

Моя проблема теперь мне нужен список пользователей, которые не использовали внешнее финансирование (TotalExternalDeposits = 0). Я потерялся.

Когда я пытаюсь добавить что-то вроде: HAVING TotalExternalDeposits = 0 Я получаю пустой набор. Я знаю, что тысячи пользователей не используют внешнее финансирование.

+1

Вы пытались вместо этого использовать предложение WHERE? –

+0

Если вы можете попробовать использовать как содержательный заголовок, как вы можете для своего вопроса, он очень ценится читателями. Я изменил его для вас. – halfer

+0

Мне кажется, что он хочет получить противоположный набор строк, чем то, что дает запрос. У меня есть предлагаемое редактирование с заголовком, обозначающим такие. (Два моих изменения пошли под моими первоначальными попытками. = /) – jpmc26

ответ

2

Предполагая join не отфильтровывая все пользователей, что вы ищете, вы могли бы просто использовать not:

SELECT table_user.user as user, sum(table_deposit.amount) as TotalExternalDeposits,payby,pro_id 
FROM table_deposit inner join 
    table_user 
    on table_deposit.user = table_user.user 
WHERE not (`table_deposit`.pro_id <> 'Cash A/C' AND 
      `table_deposit`.batch NOT LIKE '%adj%' AND 
      table_deposit.batch NOT LIKE 'Xmas%' AND 
      table_deposit.batch NOT LIKE 'X-mas%' 
     ) 
group by `table_user`.user 
order by `table_user`.user 

Однако это получает пользователь, которые имеют учетные записи, которые не являются «внешним финансированием». То есть вышеприведенные пользователи получают по меньшей мере одну учетную запись, не связанную с внешним финансированием. Вы можете быть уверены, что нет счетов внешнего финансирования (а не любых). В этом случае, вы хотите, чтобы переместить условия в п having, где вы можете рассчитывать строки, которые соответствуют - и убедитесь, что значение равно 0:

SELECT tu.user as user, sum(td.amount) as TotalExternalDeposits, payby, pro_id 
FROM table_user tu left outer join 
    table_deposit td 
    on td.user = tu.user 
group by tu.user 
having sum((td.pro_id <> 'Cash A/C' AND 
      td.batch NOT LIKE '%adj%' AND 
      td.batch NOT LIKE 'Xmas%' AND 
      td.batch NOT LIKE 'X-mas%' 
      ) or td.user is null 
     ) = 0 
order by tu.user; 

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

+0

Первый, безусловно, не то, что я хочу. Я не полностью следую за вторым. –

+0

Ahh, второй еще не закончен. Дай мне попробовать. –

+0

@LarryPenrod. , , Извини за это. Происходило какое-то движение сознания, поскольку я лучше понял этот вопрос. На данный момент я закончил. –

0

Поскольку предложение HAVING не работает, похоже, что те пользователи, которые не использовали внешнее финансирование, не имеют строк в table_deposit. Если это так, то ваш запрос должен быть чем-то вроде:

SELECT 
    table_user.user as user, 
    0 as TotalExternalDeposits, 
    payby, 
    pro_id 
FROM table_user 
WHERE user NOT IN (
    SELECT user 
    FROM table_deposit 
) 
+0

Я сделаю это, когда снова получу контроль над сервером. –

+0

Нет соединения. –

0

Если это один или и вам просто нужно противоположный набор вашего запроса, только в обратном критерии:

SELECT 
    table_user.user as user, 
    sum(table_deposit.amount) as TotalExternalDeposits,payby,pro_id 
FROM table_deposit inner join table_user on table_deposit.user = table_user.user 
WHERE table_deposit.pro_id = 'Cash A/C' 
OR table_deposit.batch LIKE '%adj%' 
OR table_deposit.batch LIKE 'Xmas%' 
OR table_deposit.batch LIKE 'X-mas%' 
group by table_user.user 
order by table_user.user 
+0

Все возвращенные пользователи имеют внешнее финансирование (> 0). –

+0

Так что это не «ситуация» или «ситуация», вы можете установить исходный запрос в качестве подзапроса и «LEFT JOIN», чтобы исключить записи, которые он возвращает. –

0

Я полагаю, что HAVING будет делать трюк, но может быть, вы с ним не справились, потому что вы, кажется, забыли добавить payby и pro_id в пункт GROUP BY, а может быть, потому что вы попытались с псевдонимом.

SELECT 
    table_user.user as user, 
    sum(table_deposit.amount) as TotalExternalDeposits,payby,table_deposit.pro_id 
FROM table_deposit inner join table_user on table_deposit.user = table_user.user 
WHERE table_deposit.pro_id <> 'Cash A/C' 
AND table_deposit.batch NOT LIKE '%adj%' 
AND table_deposit.batch NOT LIKE 'Xmas%' 
AND table_deposit.batch NOT LIKE 'X-mas%' 
GROUP BY table_user.user,payby,table_deposit.pro_id 
HAVING sum(table_deposit.amount) = 0 
ORDER BY table_user.user 
+0

0 строк возвращено. –