2016-09-26 2 views
0

У меня есть 2 таблицы, 1Poolwaitingexchange и VA05 (ZRAX), как показано на приведенной ниже ссылке.Запрос MS Access для фильтрации дубликатов с критериями

http://i.stack.imgur.com/FN9tM.png

мне нужно [VCAT] от VA05 (ZRAX) и соотношение между 2 таблиц из обоих [Код материала] -> [Description1] и [Каст PO] -> [PO Number] (также показываются в ссылке)

Единственная проблема в том, что для каждого [Material Code] & [Cust PO] могут быть дубликаты с разными [Vcat], что означает, что все поля одинаковы, кроме [Vcat], и я хочу запись с самым низким Vcat, но не с нулем.

Например. Если у дублированных записей есть [Vcat] 0, 1, 2, 3, я хочу выбрать запись, которая показывает [Vcat] как 1.

Если в записях есть только [Vcat] 0, я хочу, чтобы он показывал записать с помощью [Vcat] как 0

и если [Vcat] пуст, верните запись с помощью [Vcat] пустым.

Единственная уникальная запись - [Notif #] из таблицы 1, и я пробовал множество разных подходов, таких как группа [Notif #], сначала для каждого повторяющегося поля и MIN для [Vcat], но я просто могу Я получаю значения, которые хочу.

Мои знания SQL не существуют, и я делаю много проб и ошибок. Я надеюсь, что кто-то может помочь мне с этой проблемой.

+0

Пожалуйста, покажите ток данных, любых попыток SQL и желаемых результатов. Текстовое объяснение трудно интерпретировать. – Parfait

ответ

0

У вас есть три случая, которые вы можете UNION вместе. Кто-то, без сомнения, мог бы придумать один SELECT, который будет делать все три с IFF и OR s, но вы можете найти подход UNION, который легко поддается наблюдению, особенно если вы не знаете SQL.

Я изменил некоторые имена для собственного удобства и я использовал -999, потому что я избегаю аннулирует:

SELECT p.Material_Code, p.Cust_PO, 1 AS VCat 
    FROM Pool p 
WHERE EXISTS (SELECT * 
        FROM VARAX v 
       WHERE v.Material_Code = p.Material_Code 
         AND v.Cust_PO = p.Cust_PO 
         AND v.Vcat > 0) 
UNION 
SELECT p.Material_Code, p.Cust_PO, 0 AS VCat 
    FROM Pool p 
WHERE EXISTS (SELECT * 
        FROM VARAX v 
       WHERE v.Material_Code = p.Material_Code 
         AND v.Cust_PO = p.Cust_PO 
         AND v.Vcat = 0) 
     AND NOT EXISTS (SELECT * 
          FROM VARAX v 
         WHERE v.Material_Code = p.Material_Code 
           AND v.Cust_PO = p.Cust_PO 
           AND v.Vcat > 0) 
UNION 
SELECT p.Material_Code, p.Cust_PO, -999 AS VCat 
    FROM Pool p 
WHERE NOT EXISTS (SELECT * 
        FROM VARAX v 
        WHERE v.Material_Code = p.Material_Code 
         AND v.Cust_PO = p.Cust_PO); 
0

Звуки для меня, как вы хотите что-то вроде этого. К сожалению, у меня нет возможности проверить синтаксис моего доступа на данный момент. (Я также предполагаю, что «пустой» на самом деле нулевой. Просьба уточнить тип данных Vcat если нет.)

select 
    pwe.[Cust PO], pwe.[Part Number], 
    switch(
     not isnull(min(switch(Vcat between 1 and 3, Vcat))), 
      min(switch(Vcat between 1 and 3, Vcat)) 
     min(Vcat) = 0, 0, true, null 
    ) as Vcat 
from 
    1Poolwaitingexchange as pwe inner join VA05 as va 
     on va.[PO Number] = pwe.[Cust PO] and va.Description = pwe.[Part Number] 
group by pwe.[Cust PO], pwe.[Part Number] 

Вы правы, что моя логика была изначально плохо. Минимальный ноль всегда должен был превышать допустимые значения между 1 и 3. Модифицированная версия обрабатывает это с помощью логики, которая обрабатывает значения вне этого диапазона как нули, и поэтому их можно игнорировать с помощью агрегата min.

Вы можете уйти со слегка короткими версиями ниже. Все три имеют общую английскую интерпретацию: «Есть ли значение от 1 до 3? Тогда верните самый маленький». Я думаю, что последние два лучше читают, но я не знаю, добавишь ли ты когда-нибудь другие ценности, которые могли бы сломать их. Поскольку я не знаю природы Vcat и как они могут измениться, я оставлю это вам.

switch(
     max(Vcat) > 0, min(switch(Vcat between 1 and 3, Vcat)) 
     min(Vcat) = 0, 0, 
     true, null 
    ) as Vcat 

    switch(
     max(Vcat) between 1 and 3, min(switch(Vcat between 1 and 3, Vcat)) 
     min(Vcat) = 0, 0, 
     true, null 
    ) as Vcat 
+0

Тип данных Vcat - это номер. Когда я запускаю этот запрос, я получаю следующую ошибку: Синтаксическая ошибка (отсутствующий оператор) в выражении запроса 'case Когда min (Vcat) ........ else null end'. –

+0

Попробуйте 'switch()'. Не знаю, почему я написал это, так как я знал, что Access не использует 'case'. – shawnt00

+0

Я попытался написать конкретный запрос, чтобы отфильтровать дубликаты в моей таблице VA05 (ZRAX) с критериями 'switch()', но все возвращаемые значения равны NULL. SELECT [VA05 (ZRAX)]. [Номер ПО], [VA05 (ZRAX)]. Описание, Переключатель (Мин. (Vcat) между 1 и 3, Min (Vcat), Min (Vcat) = 0,0, True, Null) AS Vcata FROM [VA05 (ZRAX)] GROUP BY [VA05 (ZRAX)]. [PO Number], [VA05 (ZRAX)]. Описание; ' . У вас есть представление о том, почему это так? –

0

Вместо того чтобы присоединиться с VA05 (ZRAX) непосредственно, попробуйте присоединения результатов запроса из строк в VA05 (ZRAX) сгруппированы так, как вы хотите. Вы можете сделать это с двумя группами подзапросов для минимального значения с нулями и без них.

Таким образом, вы будете иметь еще один запрос с именем qry_va05zrax_toPool_min в

select 
[po number], description, 
vcatmin:min(vcat) 
from VA05(ZRAX) 
group by 
[po number],description 

и qry_va05zrax_toPool_minGT0:

select 
[po number], description, 
vcatminGT0:min(vcat) 
from VA05(ZRAX) 
group by 
[po number],description 
having vcat > 0 

и третий на обоих из них, как:

select 
[po number], description, vcatVal:iif(vcatminGT0 is not null, vcatminGT0,iif(vcatmin is not null, 0, null)) 
from 
1poolWaitingExchange p left outer join 
qry_va05zrax_toPool_min m on 
p.[po number] = m.[po number] and 
p.description = m.description left outer join 
qry_va05zrax_toPool_minGT0 z on 
p.[po number] = z.[po number] and 
p.description = z.description 
+0

Я понимаю, как это сделать, и мне нравится идея, стоящая за ней. Однако результаты, которые я хочу получить в первом запросе, - это не только min (Vcat), но сказать, что если Vcat имеет 0, 1, 2, я хочу, чтобы результаты были равны 1. Если Vcat имеет только 0, тогда результат равен 0. Min (Vcat) дает самую низкую запись независимо от того, что так не подходит для результатов, которые мне нужны. –

+0

попробуйте обновленный ответ, вы можете сделать это с помощью двух подзапросов, определяющих два минимальных значения: одно с одним и без нулей. – Beth

Смежные вопросы