Eu vou fazer o meu melhor aqui.
Tenho uma lista de citações que foram escritas e algumas informações sobre essas citações. Preciso selecionar as citações que foram anuladas em um determinado intervalo de datas e onde a pessoa que o escreveu também escreveu mais de 5 citações nesse mesmo intervalo de datas.
Eu quero um resultado que mostre todas as citações que a pessoa 'x' escreveu citação 1 ... info, citação 2 ... info, citação 3 ... info, citação 4 ... info, citação 5 ... info, ... etc
DECLARE @BeginDate Date = '3/15/2015'
DECLARE @EndDate Date = '4/1/2015'
DECLARE @MinVoids INT = 5
SELECT d.CreatorUserId
FROM [ECITATION].[dbo].[tblDocument] AS d
JOIN [ARK].[dbo].[DocStatus] AS ds
ON d.DocStatus = ds.StatusNum AND (ds.StatusName LIKE 'void%')
WHERE DateModified BETWEEN @BeginDate AND @EndDate
--DateModified is when the document was voided--
GROUP BY d.CreatorUserId
HAVING COUNT(d.CreatorUserId) >= @MinVoids
Isso me dá os guias certos, mas não todos eles. Não consigo descobrir por que não está pegando todos eles. (Deveria ser 16 e eu só tenho 11). Tenho a sensação de que COUNT não está funcionando como eu gostaria.
E só porque estou paranóico em parecer ignorante em relação aos gurus do SQL, comecei a aprender SQL há cerca de duas semanas.
SOLUÇÃO Havia algumas informações que deixei de fora que poderiam ter ajudado, mas a resposta ainda ajudou muito para resolvê-lo.
DECLARE @BeginDate Date = '3/15/2015'
DECLARE @EndDate Date = '4/1/2015'
DECLARE @MinVoids INT = 5
SELECT d.CreatorFirstName + ' ' + d.CreatorLastName as name
,ds.StatusName
FROM [ECITATION].[dbo].[tblDocument] AS d
JOIN [ARK].[dbo].[DocStatus] AS ds
ON d.DocStatus = ds.StatusNum
WHERE DateModified BETWEEN @BeginDate AND @EndDate
AND (ds.StatusName LIKE 'void%')
AND ((ds.StatusNum BETWEEN 1 AND 20) OR (ds.StatusNum BETWEEN 100 AND 120))
AND ( SELECT COUNT(*)
FROM [ECITATION].[dbo].[tblDocument] AS dc
JOIN [ARK].[dbo].[DocStatus] AS dst
ON dc.DocStatus = dst.StatusNum
WHERE dc.CreatorUserId = d.CreatorUserId
AND (dst.StatusName LIKE 'void%')
AND dc.DateCreated BETWEEN @BeginDate AND @EndDate
AND ((dst.StatusNum BETWEEN 1 AND 20) OR (dst.StatusNum BETWEEN 100 AND 120))
) >= @MinVoids
ORDER BY name
Não é uma consulta trivial. Você precisa de mais uma junção ou uma subconsulta:
Não tenho certeza sobre o nome da coluna (usada
DateCreated
) na tabela[tblDocument]
. Modifique de acordo