Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Группировка  [new]
Pabl0
Member

Откуда:
Сообщений: 265
Подскажите как лучше поступить в такой ситуации?

Вот так работает правильно, потому что группирует по ID
SELECT C.ID, C.CodePostav, C.VidID, C2.SubActivity, COUNT(isnull(C.Approval,0)) as JOB1, COUNT(isnull(A2.[Type],0)) as JOB2, COUNT(isnull(C.ID,0)) as JOB3 
FROM ContractFullSubActivity C2
INNER JOIN Approvals A2 ON A2.ID = C2.ContractID
INNER JOIN ContractFull C ON C.ID = A2.ID AND C.ID = C2.ContractID 
WHERE C. VidID = 2 AND C2.SubActivity = 11 AND C.Archive <> -1 AND C.[Status] > 0  
AND ((NOT EXISTS ( SELECT A.ID FROM Approvals A WHERE C.ID = A.ID AND A.Magic = 'CONTRACTTENDER' AND A.[Type] IS NOT NULL)) 
OR (NOT EXISTS ( SELECT A.ID FROM Approvals A WHERE C.ID = A.ID AND A.Magic = 'CONTRACTTENDER' AND A.[Type] = 12 AND A.[Type] NOT IN (0,11)))) --AND A2.Magic = 'CONTRACTTENDER'
GROUP BY  C.ID, C.CodePostav,  C.VidID, C2.SubActivity


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

SELECT /* C.ID, C.CodePostav,  */C.VidID, C2.SubActivity, COUNT(isnull(C.Approval,0)) as JOB1, COUNT(isnull(A2.[Type],0)) as JOB2, COUNT(isnull(C.ID,0)) as JOB3 
FROM ContractFullSubActivity C2
INNER JOIN Approvals A2 ON A2.ID = C2.ContractID
INNER JOIN ContractFull C ON C.ID = A2.ID AND C.ID = C2.ContractID 
WHERE C. VidID = 2 AND C2.SubActivity = 11 AND C.Archive <> -1 AND C.[Status] > 0  
AND ((NOT EXISTS ( SELECT A.ID FROM Approvals A WHERE C.ID = A.ID AND A.Magic = 'CONTRACTTENDER' AND A.[Type] IS NOT NULL)) 
OR (NOT EXISTS ( SELECT A.ID FROM Approvals A WHERE C.ID = A.ID AND A.Magic = 'CONTRACTTENDER' AND A.[Type] = 12 AND A.[Type] NOT IN (0,11)))) --AND A2.Magic = 'CONTRACTTENDER'
GROUP BY /*  C.ID, C.CodePostav,  */C.VidID, C2.SubActivity
7 июн 16, 13:32    [19266901]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Pabl0,

а что значить "группирует неправильно "
7 июн 16, 13:39    [19266957]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Pabl0
Member

Откуда:
Сообщений: 265
В первом случае, получается 4 записи

+
12126000 254 2 11 12 12 12
12177000 260 2 11 18 18 18
12205000 272 2 11 14 14 14
12215000 278 2 11 15 15 15


Во втором случае, получается 59 записей
+
2 11 59 59 59
7 июн 16, 13:44    [19266986]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Добрый Э - Эх
Guest
Pabl0,

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

SELECT /*C.ID, C.CodePostav, C.VidID,*/ C2.SubActivity, COUNT(isnull(C.Approval,0)) as JOB1, COUNT(isnull(A2.[Type],0)) as JOB2, COUNT(isnull(C.ID,0)) as JOB3 
FROM ContractFullSubActivity C2
INNER JOIN Approvals A2 ON A2.ID = C2.ContractID
INNER JOIN ContractFull C ON C.ID = A2.ID AND C.ID = C2.ContractID 
WHERE C. VidID = 2 AND C2.SubActivity = 11 AND C.Archive <> -1 AND C.[Status] > 0  
AND ((NOT EXISTS ( SELECT A.ID FROM Approvals A WHERE C.ID = A.ID AND A.Magic = 'CONTRACTTENDER' AND A.[Type] IS NOT NULL)) 
OR (NOT EXISTS ( SELECT A.ID FROM Approvals A WHERE C.ID = A.ID AND A.Magic = 'CONTRACTTENDER' AND A.[Type] = 12 AND A.[Type] NOT IN (0,11)))) --AND A2.Magic = 'CONTRACTTENDER'
GROUP BY  C.ID, C.CodePostav,  C.VidID, C2.SubActivity


надеюсь, теперь и группирует, и выводит правильно
7 июн 16, 13:47    [19267013]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Pabl0
Member

Откуда:
Сообщений: 265
Всем спасибо, сам добился результата :)

SELECT C.VidID, C2.SubActivity, COUNT(isnull(C.Approval,0)) as JOB1
FROM ContractFullSubActivity C2
INNER JOIN ContractFull C ON C.ID = C2.ContractID 
WHERE C. VidID = 2 AND C2.SubActivity = 11 AND C.Archive <> -1 AND C.[Status] > 0 
AND (C.Approval IN (SELECT TYPE  FROM Approvals A WHERE (NOT EXISTS ( SELECT A.ID FROM Approvals A WHERE C.ID = A.ID AND A.Magic = 'CONTRACTTENDER' AND A.[Type] IS NOT NULL)) 
) OR C.Approval IN (SELECT TYPE  FROM Approvals A WHERE (NOT EXISTS ( SELECT A.ID FROM Approvals A WHERE C.ID = A.ID AND A.Magic = 'CONTRACTTENDER' AND A.[Type] = 12 AND A.[Type] NOT IN (0,11))))) 

GROUP BY  C.VidID, C2.SubActivity 
7 июн 16, 13:48    [19267030]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить