[SQL2000] proszę o pomoc z zapytaniem SQL

0

Witam,

Niestety potrzebuję wstawić do kodu programu zapytanie MS SQL którego stworzenie przekracza moje możliwości więc proszę o pomoc.

Mam tabelę z zamówieniami i zatwierdzeniami do nich: zatw1, zatw2, zatw3, zatw4, zatw5.
Zatwierdzenia mogą przyjmować wartości: null (puste), tak, nie, n/a (nie dotyczy).
Potrzebuję zrobić filtr na zamówienia oczekujące, a więc takie które:

  • mają jeszcze jakiś 'null' gdziekolwiek,
  • ale jednocześnie nie zostały odrzucone jakimkolwiek 'nie',
  • i nie są brane pod uwagę pola z n/a (nie dotyczy)

Mam nadzieję, że jasno się wyraziłem i oczywiście chodzi o to co ma być w klauzuli po where :)

--
z góry dziękuję,
Rafał

0

Znaczy sie masz 5 kolumn zatwx? Nie lepiej zrobic osobna tabele? Wtedy zapytanie byloby krotsze i bardziej intuicyjne. Pomijajac juz fakt, ze baza bylaby w postaci wlasciwej (min 2NF chyba).

W Twoim przypadku bedzie to cos takiego:

select ... from tabela where (zatw1 is null && zatw1 != 'nie') || (zatw2 is null && zatw2 != 'nie') ...

Zastanow sie tylko co bedzie jak potrzebne bedzie 6 zatwierdzenie.

0

Dziękuję za odpowiedź.
Baza już taka jest z różnymi innymi danymi, a 6 zatwierdzenie nie powinno być potrzebne.

Niestety to zapytanie nic mi nie zwraca :(

Może dokładnie je przytoczę jak to robię:

select REPLACE(CONVERT(VARCHAR,date,5),'/','/') as date , prID, supplier, value, currency, orderer, name, appr1decision, appr2decision, appr3decision, appr4decision, appr5decision FROM pr where
(appr1decision IS NULL and appr1decision != 'Nie') or (appr2decision IS NULL and appr2decision != 'Nie') or (appr3decision IS NULL and appr3decision != 'Nie') or (appr4decision IS NULL and appr4decision != 'Nie') or (appr5decision IS NULL and appr5decision != 'Nie')
ORDER BY prID desc

Ku ścisłości to zatwierdzenia się właśnie nazywają apprXdecision, a decyzje są z dużych liter.

--
pozdrawiam,
Kranu

0

A zaraz, chwila, bo chyba cos zle przeczytalem. Moj warunek tez troche bez sensu ;)

  • mają jeszcze jakiś 'null' gdziekolwiek,
  • ale jednocześnie nie zostały odrzucone jakimkolwiek 'nie',

Czy to oznacza, ze co najmniej jedna kolumna jest null i zadna nie jest 'nie'?

To raczej w ten sposob

SELECT ... FROM tabela WHERE (zatw1 IS NULL || zatw2 IS NULL || ...) && zatw1 != 'Nie' && zatw2 != 'Nie' && ...
0

Tak, potrzebuję aby było tak jak napisałeś.

I właśnie na samym początku wykombinowałem zapytanie jak teraz napisałeś:

select REPLACE(CONVERT(VARCHAR,date,5),'/','/') as date , prID, supplier, value, currency, orderer, name, appr1decision, appr2decision, appr3decision, appr4decision, appr5decision FROM pr where
(appr1decision is null or appr2decision is null or appr3decision is null or appr4decision is null or appr5decision is null)
and
(appr1decision !='Nie' or appr2decision !='Nie' or appr3decision !='Nie' or appr4decision !='Nie' or appr5decision !='Nie')
ORDER BY prID desc

Ale takie zapytanie zwraca mi również na przykład:

  1. Tak
  2. Nie
  3. NULL
  4. n/a
  5. n/a
    Przecież tego "Nie" tam nie powinno być :/

--
dzięki,
Kranu

0

Twoje zapytanie nie jest takie samo jak moje, zwroc uwage na && w drugiej czesci where ;)

0

Ok, więc po Twojemu to będzie tak:

select REPLACE(CONVERT(VARCHAR,date,5),'/','/') as date , prID, supplier, value, currency, orderer, name, appr1decision, appr2decision, appr3decision, appr4decision, appr5decision FROM pr where 
(appr1decision is null or appr2decision is null or appr3decision is null or appr4decision is null or appr5decision is null)
and appr1decision !='Nie' and appr2decision !='Nie' and appr3decision !='Nie' and appr4decision !='Nie' and appr5decision !='Nie'
ORDER BY prID desc

i to nadal nic nie zwraca chociaż oczywiście są takie samówienia :/

Stosuję or zamiast || i and zamiast && bo SQL 2000 tak wymaga, ale to chyba nie ma znaczenia.

Ehhh, chyba muszę się poddać i po prostu rozpisać wszystkie możliwe przypadki..

--
pozdrawiam,
Kranu

0

Podaj przyklad danych, bedzie mi latwiej testowac.

0

To pokażę fragment tabeli właśnie z tymi zatwierdzeniami:
http://kranu.x.pl/download/prdb.jpg
Interesuje mnie wyciągnięcie takich danych jak opisałem w pierwszym poście.

--
dzięki,
Kranu

0
/*
create table ##mm
(id int not null identity(1, 1),
a1 varchar(3) null,
a2 varchar(3) null,
a3 varchar(3) null,
a4 varchar(3) null,
a5 varchar(3) null)

insert ##mm values('tak', 'tak', 'tak', 'tak', 'nie')
insert ##mm values('tak', 'tak', 'tak', 'tak', 'tak')
insert ##mm default values
insert ##mm default values
insert ##mm values(null, null, null, 'n/a', 'n/a')
insert ##mm values('tak', 'tak', 'tak', null, null)
insert ##mm values(null, null, null, 'n/a', 'n/a')
insert ##mm values('tak', 'tak', null, 'n/a', 'n/a')
insert ##mm values(null, null, null, 'n/a', 'n/a')

insert ##mm values('tak', 'tak', 'tak', null, null)
insert ##mm values('tak', 'tak', 'tak', 'n/a', 'n/a')
insert ##mm values('tak', 'tak', 'tak', 'n/a', 'n/a')
insert ##mm values('tak', 'tak', 'tak', 'n/a', 'n/a')
insert ##mm values('tak', 'nie', null, 'n/a', 'n/a')

*/
select * from ##mm where a1+a2+a3+a4+a5 is null and coalesce(a1,'')+coalesce(a2,'')+coalesce(a3,'')+coalesce(a4,'')+coalesce(a5,'') not like '%nie%'

pozdrawiaMM

0

Ja mam takie cos:

select * from orders where 
	(appr1decision is null or appr1decision != 'Nie') 
	and (appr2decision is null or appr2decision != 'Nie') 
	and (appr3decision is null or appr3decision != 'Nie') 
	and (appr4decision is null or appr4decision != 'Nie') 
	and (appr5decision is null or appr5decision != 'Nie')

ale to powyzej to ciekawe podejscie do tematu ;)
A problem z tamtymi byl w tym, ze a != b zwraca null (a nie wartosc logiczna) jesli a lub b jest nullem

0

Marcin... co to jest? Chyba nie mój poziom :/

--
Kranu

0

Johny to zwraca również zamówienia z kompletami zatwierdzeń które nie są oczekujące, np.

  1. 'Tak'

  2. 'Tak'

  3. 'Tak'

  4. 'Tak'

  5. 'Tak'

  6. 'Tak'

  7. 'Tak'

  8. 'Tak'

  9. 'n/a'

  10. 'n/a'

Ale może gdy zrozumię co było w tamtym źle to będę już potrafił poprawić.

--
dzięki,
Kranu

0

To powyżej, to na początku (to zaremowane całe), to tworzę sobie tabelę tymczasową i wypełniam ją Twoimi danymi (nie wszystkimi bo mi się nie chciało). Najważniejszy jest SELECT poniżej.
sprawdza, czy w KTÓREJKOLWIEK kolumnie od a1 do a5 jest null za pomocą konkatenacji stringów. Konkatenacja działa tak, że jesli JAKIKOLWIEK wyraz jest Nullem, to w wyniku jest Null. Czyli jeśli a1+a2+a3+a4+a5 IS NULL, to znaczy, że któryś z nich jest nullem.
Drugi warunek sprawdza, czy gdzieś nie występuje 'Nie'. Jak już napisałem gdyby były Nulle, to w wyniku byłby także null, więc trzeba te Nulle pozamieniać na pusty ciąg. Czyli każdą kolumnę musimy 'potraktować' funkcją np. Coalesce, która zamienia Nulla na ''. I łączymy te wszystkie elementy. Potem sp[rawdzamy, czy jest gdzieś w środku 'Nie' np. za pomocą LIKE. Wot, cała magia.

pozdrawiaMM

0

Johny chodziło mi o jednoczesne zachowanie pozostałych warunków, ale i tak Ci bardzo dziękuję za zaangażowanie, na pewno coś z tego się przy okazji nauczyłem.

Marcinie - to działa w Query Analyzerze - nie do końca temu ufając (bo nie znałem takiego czegoś) sprawdziłem wiersz po wierszu i zwraca dokładnie to co chciałem :)
Więc jeśli w programie się będzie to równie dobrze spisywać to to zastosuję.

Dziękuję za rozwiązanie i przede wszystkim wytłumaczenie, bo nie rozumiejąc tego do końca na pewno bym się bał zastosować.

--
pozdrawiam,
Kranui

0

Wiem, wiem, moj blad ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1