Исключение из SQL-запросов на сложный доступ - PullRequest
0 голосов
/ 03 июня 2009

Для базы данных доступа, которая выглядит следующим образом: (Все текстовые поля)

Co1 Co2 Co3 Co4
A   k   t   N1
B   k   t   N2
A   m   t   N3
B   k   z   N4
A   k   z   N5
C   m   t   N6
C   k   z   N7
C   k   t   N8
A   k   t   N9
C   m   t   N10

Мне нужно создать какие-то отчеты, которые бы делали следующее:

Результаты должны выбрать строки:

  1. Сначала заказано Co1
  2. затем заказывается Co2
  3. включает только данные, где Co3 = t или r
  4. когда Co3 НЕ t или r, тогда все остальные строки с предшествующим C04 где Co1 и Co2 были такими же, как и в текущей строке, также исключены

1,2 и 3 чрезвычайно легко сделать (пункты Order by и Where соответственно), но можно # 4 сделать в доступе SQL? Если это невозможно, я сделаю небольшое приложение на C #, которое просматривает данные, но я чувствую это должно быть возможно сделать в SQL, и если это возможно, это определенно будет намного лучше.

Фактический запрос и база данных более сложны, но я застрял в # 4.

В примере, который я привел, результат будет:

A   m   t   N3
A   k   t   N9
C   m   t   N6
C   m   t   N10
C   k   t   N8

Я считаю, что это охватывает все возможные случаи.

Точность, мы используем четвертый столбец (C4 в этом примере), чтобы определить порядок но это текстовое поле с символами и цифрами в нем. Поле представляет собой букву, за которой следуют 2 цифры: A01, A02, .. A99, B01 и т. Д. Точность № 2, я не виноват в этом дизайне базы данных. : P

Так, для гуру SQL среди нас, это может быть сделано в доступе SQL? Как?

Большое спасибо за любую помощь, которую вы можете оказать.

Ответы [ 3 ]

0 голосов
/ 03 июня 2009

Модификация запроса Andomar, которая учитывает значения в Co4, начиная с разных букв, используя значение ASCII кода символа для определения порядка. Я предполагаю, что диапазон составляет A01 ... A99, B01 ... B99 и т. Д., И что B01 следует считать "более поздним", чем A99.

select *
from Table1 cur
where not exists (
    select 1
    from Table1 later
    where cur.Co1 = later.Co1 
    and cur.Co2 = later.Co2
    and later.Co3 not in ('t','r') 
    and (asc(left(later.Co4,1)) * 100) + CInt(Mid(later.Co4,2)) > (asc(left(cur.Co4,1)) * 100) + CInt(Mid(cur.Co4,2))
)
and cur.Co3 in ('t','r')
order by cur.Co1, cur.Co2
0 голосов
/ 03 июня 2009

Пока не ответ, но установочный код для коллег-ответчиков.

create table #boost (
  Co1 char(1),
  Co2 char(1),
  Co3 char(1),
  Co4 char(3)
)

insert into #boost values ('A', 'k', 't', 'N1')
insert into #boost values ('B', 'k', 't', 'N2')
insert into #boost values ('A', 'm', 't', 'N3')
insert into #boost values ('B', 'k', 'z', 'N4')
insert into #boost values ('A', 'k', 'z', 'N5')
insert into #boost values ('C', 'm', 't', 'N6')
insert into #boost values ('C', 'k', 'z', 'N7')
insert into #boost values ('C', 'k', 't', 'N8')
insert into #boost values ('A', 'k', 't', 'N9')
insert into #boost values ('C', 'm', 't', 'N10')
0 голосов
/ 03 июня 2009

Если я правильно вас прочитал:

когда Co3 не t или r, тогда все другие строки с предшествующим C04, где Co1 И СО2 были такими же как текущие строки также исключены

Это эквивалентно исключению строк, для которых существует более поздняя строка с определенными условиями. Вы можете сделать это с предложением NOT EXISTS:

select *
from YourTable cur
where cur.Co3 in ('t','r')
and not exists (
    select *
    from YourTable later
    where cur.Co1 = later.Co1 
    and cur.Co2 = later.Co2
    and later.Co3 not in ('t','r') 
    and CInt(Mid(later.Co4,2)) > CInt(Mid(cur.Co4,2))
)
order by cur.Co1, cur.Co2 desc, CInt(Mid(cur.Co4,2))

Теперь N10 обычно не больше, чем N5. Вот для чего предназначен CInt (Mid (..., 2)): он превращает N10 в число 10, а число N5 в 5.

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