logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[FireBird/SQL] FireBird/SQL: Jak pobrać daty z pól o najwyższym numerze w tabeli DATY?

arnoldziq 18 Maj 2011 11:14 4484 4
REKLAMA
  • #1 9518936
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 299
    Witam wszystkich serdecznie.
    Potrzebuję od szanownych koleżanek i kolegów pewnej podpowiedzi, bo przyznam się , że utknąłem w martwym punkcie.
    Problem polega na utworzeniu takiego zapytania SQL, które zwracałoby zawartość różnych pól, w zależności od ich zawartości.
    Dana jest tabela DATY :
    Kod: SQL
    Zaloguj się, aby zobaczyć kod

    Z przykładowymi danymi :
    [FireBird/SQL] FireBird/SQL: Jak pobrać daty z pól o najwyższym numerze w tabeli DATY?
    Cały problem jest w tym, żeby w miarę możliwości, wybrać daty z pól o wyższym numerze (01,02,03) jeżeli takowe istnieją.
    Tabela (widok) wynikowy, powinien wyglądać mniej więcej tak :
    Kod: SQL
    Zaloguj się, aby zobaczyć kod
    I dla rekordu z ID = 1 powinny być pobrane START01,FINISH01, ponieważ inne daty nie są podane. Dla rekordu ID=5, są podane wszystkie, więc dane do tabeli wynikowej, powinny być pobrane z START03,FINISH03. Dla rekordu ID=4, są podane tylko daty do START02,FINISH02, więc dane do tabeli wynikowej, powinny być pobrane z START02,FINISH02.
    Myślę, że opisałem to dość jasno. W razie problemów, proszę zadawać pytania.
    Od razu zastrzegam, że daty w polu np. START03 może być zarówno dużo większa lub dużo mniejsza niż np. w polu START01. Może się także zdarzyć, że wszystkie daty będą identyczne, we wszystkich polach. Nie ma co do tego żadnych ograniczeń.
    Daty są zawsze wprowadzane w porządku 01, 02 i 03, tak, że nie pojawią się tam "puste" miejsca. Niewypełnione pola w rekordach, są ustawiane na null.

    Z góry dziękuję za pomoc.
  • REKLAMA
  • Pomocny post
    #2 9519349
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    Możesz użyć wyrażenia CASE-WHEN w części SELECT, coś takiego:
    http://www.janus-software.com/fbmanual/manual.php?book=psql&topic=56

    Bardziej kulturalnie będzie napisać funkcję, która będzie przyjmowała 3 daty i zwracała jedną:
    select
    selectDate(start1, start2, start3) as startDate
    ...
    
  • REKLAMA
  • #3 9519509
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 299
    Dziękuję bardzo. Właśnie o to mi chodziło. 100 punktów wędruje do kolegi.
    Gotowe rozwiązanie problemu :
    Kod: SQL
    Zaloguj się, aby zobaczyć kod

    Oraz wygląd tablicy wynikowej :
    [FireBird/SQL] FireBird/SQL: Jak pobrać daty z pól o najwyższym numerze w tabeli DATY?
  • REKLAMA
  • #4 9520272
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    To nadmienię jeszcze, że FB bodjaże od wersji 2.0 obsługuje także IIF, które zastosowanie ma podobne do CASE..WHEN..ELSE (z jednym warunkiem).

    ale to, co napisałeś znacznie łatwiej uzyskać w ten sposób:
    Kod: SQL
    Zaloguj się, aby zobaczyć kod
  • #5 9758145
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 299
    Dziękuję za udzieloną pomoc.
    Temat zamykam.
REKLAMA