T SQL Group By Count возвращает неправильные данные - PullRequest
0 голосов
/ 02 ноября 2011

У меня сложный t-sql-запрос «для меня в любом случае», который не работает так, как мне нужно.Запрос предназначен для возврата симулированных записей, объединенных в две базы данных, которые имеют симулированные записи в каждой базе данных.В случае сбоя продукта ему будет присвоено значение «Сбой» в одной БД или «PF» в другой БД.«PR» означает «ГОТОВ ПРОДУКТ» в обоих.Я пытаюсь вернуть список, который содержит только данные «Failed or PF», в которых <две записи основаны на столбце ProdNo.«Это должно побудить сотрудника снова протестировать продукт», если в одной из БД существует 2 записи, никаких действий не требуется. «Мой запрос прерывается, когда я пытаюсь ограничить результаты отображением только записей, которые имеют менее 2 дубликатов»Значения ProdNo ". Другими словами, продукт производится и ему присваивается номер ProdNo. После тестирования его можно пометить как PR, PF или Failed. Мой запрос никогда не должен давать никаких результатов с PR, но при выполнении тестаЧерез несколько дней после исходного теста в моих результатах появятся значения PR. </p>

Вот запрос с примечаниями.


-- 1st half of union query

-- Find all run failed's that do not have a PR'ed 2nd test.

Declare @daysback int
set @daysback = -2

select min(sid3)as 'ProdNo',
    min([Timestamp])as 'TimeS',
    min(Burn) as 'type',
    min(Mixer) as 'Mixer'
from [Stat].[dbo].[oedata]  
where sid3 IN 
(
-- Find run faileds and PRs in Stat db 

    SELECT [sid3]
    from [Stat].[dbo].[oedata]
    where (type ='wos') and (burn = 'failed')
    and (Flag = '128')
)
 --- Limit Results to return only instances of 1 record

AND [Timestamp] > DATEADD( d, @daysback, getdate())
group by Sid3 
having COUNT(Sid3) = 1

union all 

-- Find PF's in CompanyMES MLab DB

select min(mProd_ProdNumber)as 'ProdNo',
    min([Timestamp])as 'TimeS',
    min(CheckType) as 'type',
    min(Mixer) as 'Mixer'

from [CompanyMES].[dbo].[mLab]  

where mProd_ProdNumber IN 
(
    -- Find failed DFs or scrap wos products
    SELECT [mProd_ProdNumber]
    from [CompanyMES].[dbo].[mLab]  
    where (CheckType = 'PF' ) 
)
-- Limit Results to instances with only 1 record
AND [Timestamp] > DATEADD( d, @daysback, getdate())
group by mProd_ProdNumber 
having COUNT(mProd_ProdNumber) < 2 
order by TimeS Desc
--------------------------------------------------------------------------

Пример данных и результатов:

ProdNo   Type
=================
'1111'   'PF' 
'1111'   'PR' 
'1112'   'PR'  
'1113'   'PF' 
'1114'   'Failed' 

ProdNo 1111 не должен ничего возвращать, поскольку у него есть 2 записи, а также существует PR.
1113 и 1114 должны возвращать результаты, поскольку у них обоих есть только 1 запись, а также PF и Failed Types

1 Ответ

0 голосов
/ 02 ноября 2011

Я думаю, проблема в том, что вы применяете фильтр к метке времени в ваших внешних запросах, а не во внутреннем, где вы фильтруете номера продуктов.Таким образом, для 1111 и 1112 он может иметь «PF» (или «Failed») за пределами вашего отфильтрованного диапазона временной метки, но только «PR» внутри него (в одной из таблиц).

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