2015-05-06 1 views
0

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

Адрес: Запустить отчет с указанием всех ключей учетной записи со своим типом буклета, который не имеет версии WIP.

Фон: Каждый ключ учетной записи в нашей системе имеет 9 разных типов буклетов. Каждый из этих типов имеет статус. Статус может быть (3) Ожидает утверждения, (4) Утверждено, (5) Незавершенное производство или (8) Отклонено.

Выборочные данные с результатами: enter image description here

С этого экрана вы можете увидеть, что все типы буклет КРОМЕ «Автопортрет Registeration» НЕ есть (5) работа. Они должны быть в отчете, который я пытаюсь получить.

Другой пример, чтобы объяснить, что я пытаюсь получить: enter image description here

тот же запрос, только с помощью другого ключа учетной записи. Вы можете видеть, что AIP имеет статус (5) Прогресс в работе указан 3 раза, поэтому это НЕ будет отображаться в отчете, который я пытаюсь собрать.

Ниже приведен код, я пытался, но не похоже на работу:

select b.trackingid, b.bookletname from booklet b 
inner join [status] s on s.id = b.statusid 
inner join [user] u on b.createdby = u.id 
inner join client c on u.clientid = c.id 
where c.clientname = 'MM' and 
(select count(*) from booklet where trackingid = b.trackingid and statusid = 5) = 0 

Я также попытался с помощью GROUP BY и HAVING:

select trackingid, b.bookletname, b.StatusID from booklet b 
inner join [user] u on u.id = b.userid 
inner join [client] c on c.id = u.clientid 
where c.id = 2 
--and b.statusID != 5 
group by trackingid, bookletname, b.StatusID 
--having count(statusid) < 1 
order by trackingid 

Любая помощь очень ценится , Благодаря!

+1

Try 'и b.statusID <> 5' в вашем где п. – Andrew

+0

В вашем вопросе есть множество примеров и скриншотов, но я смущен - я до сих пор не знаю, что именно вы пытаетесь сделать. Можете ли вы предоставить образец ожидаемого результата? –

+0

Когда вы говорите 'так, что это НЕ будет отображаться ', вы ссылаетесь только на то, что отмеченные деревом реестры или все AIP, которые имеют один и тот же' trackingId'? –

ответ

1

Когда я пытаюсь сообщить о наборах данных с большим количеством строк на ключ, на который я смотрю, мне нравится генерировать список ключей с помощью; таким образом, ваш основной запрос не должен смотреть ни на что другое. так пару примеров может выглядеть следующим образом:

; with wips as (
     Select Distinct trackingid 
    From booklet 
    Where statusid = 5 
    ), 
    nowips as(
    Select Distinct trackingid nwtid 
    From booklet 
    Where TrackingID not in (select * from wips) 
    ) 
Select <what ever you need> 
From Booklet 
Join nowips on TrackingID=nwtid 
Where <additional logic> 

и

; with nowips as(
    Select Distinct trackingid nwtid 
    From booklet 
    Where not exists (
      Select Distinct trackingid wtid 
     From booklet 
     Where statusid = 5 
     and  wtid = nwtid) 
    ) 
Select <what ever you need> 
From Booklet 
Join nowips on TrackingID=nwtid 
Where <additional logic> 

Это должно помочь устранить WIP данные из отчета.

0

Пожалуйста, попробуйте следующее:

--returns all bookletname not in status_id = 5 
SELECT 
    trackingid 
    ,b.bookletname 
    ,b.StatusID 
    ,count(*) 
FROM booklet b 
INNER JOIN [user] u ON u.id = b.userid 
INNER JOIN [client] c ON c.id = u.clientid 
WHERE c.id = 2 
    AND b.statusid <> 5 
GROUP BY trackingid, b.bookletname,b.statusid 

UNION 

--returns bookletnames = 'Self Registration and b.statusid = 5 
SELECT 
    trackingid 
    ,b.bookletname 
    ,b.StatusID 
    ,count(*) 
FROM booklet b 
INNER JOIN [user] u ON u.id = b.userid 
INNER JOIN [client] c ON c.id = u.clientid 
WHERE c.id = 2 
    AND b.statusid = 5 
    AND b.bookletname = 'Self Registration' 
GROUP BY trackingid, b.bookletname,b.statusid 
ORDER BY trackingid 

Это должно вернуть сочетание обоих bookletname где StatusID <> 5 в том числе, где регистрация самостоятельно и StatusID = 5. Надеюсь, что это помогает!

0

Вы хотите исключить trackingid, если есть какая-либо строка с statusID=5? ли условный отсчет с помощью СЛУЧАЙ:

select trackingid, b.bookletname 
from booklet b 
inner join [user] u on u.id = b.userid 
inner join [client] c on c.id = u.clientid 
where c.id = 2 
group by trackingid, bookletname 
having sum(case when b.statusID = 5 then 1 else 0 end) = 0