Zapytanie SQL

0

Jak stworzyć zapytanie, które będzie zwracać rekordy, jeżeli:

  • dla danego ID jest więcej niż 1 rekord to zwraca tam gdzie w kolumnie Wartość >0,
    lub
  • dla danego ID jest jeden rekord

plik xls z przykladowa tabela i zaznaczonymi oczekiwanymi wierszami do zwrotku przez zapytanie (zaznaczone na żółto).
Dzięki za pomoc.

1

Np. tak:

SELECT
  ID, 
  WARTOSC 
FROM 
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY CASE WHEN WARTOSC>0 THEN 0 ELSE 1 END) RN, 
    ID,
    WARTOSC
  FROM 
    TABELKA
) T WHERE RN=1;
0

Thx. Nie udaje mi się zaadoptować tego do mojego przykładu. Może rzucić okiem?
ID to produkt.numer_paczki, a WARTOSC to okucie_produkt.numer_paczuszki.

SELECT okucie_produkt.numer_paczuszki, produkt.numer_paczki, produkt.kod_artykulu, produkt.opis_pl
FROM produkt LEFT JOIN (okucie RIGHT JOIN okucie_produkt ON okucie.[id_okucie] = okucie_produkt.[id_okucie]) ON produkt.[id_produkt] = okucie_produkt.[id_produkt]
GROUP BY okucie_produkt.numer_paczuszki, produkt.numer_paczki, produkt.kod_artykulu, produkt.opis_pl;

1

Twoje zapytanie wrzucam do osobnego bloku, żeby się odciąć od tego co robi, a skupić tylko na części technicznej, tj.

  1. podzieleniu zbioru na grupy (po numer_paczki)
  2. ponumerowaniu rekordów w ramach grupy (te, które mają wartość >0 ustawiam wcześniej, a te z wartością = 0, później)
  3. wyborze pierwszego rekordu z grupy (jak będzie tylko 1 rekord, to wybierze jeden, jak będzie więcej rekordów, to wybierze jakiś z wartością > 0)
WITH tableka AS (
  /* TWOJE ZAPYTANIE */
)
SELECT
  NUMBER_PACZKI, 
  WARTOSC 
FROM 
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY NUMBER_PACZKI ORDER BY CASE WHEN NUMER_PACZUSZKI>0 THEN 0 ELSE 1 END) RN, 
    NUMBER_PACZKI,
    NUMER_PACZUSZKI
  FROM 
    TABELKA
) T WHERE RN=1;

Nie napisałeś jaki to silnik, więc założyłem, że są w nim dostępne funkcje analityczne ;-) Tu wykorzystana jest ROW_NUMBER().

0

Dzięki za odp. Uruchamiam to w Accessie...I wywala mi: "Niewłaściwa instrukcja SQL: oczekiwano 'DELETE', 'INSERT','SELECT' lub 'UPDATE'"

1
select 
 t.id
,t.wartosc
from 
   t
   inner join (select id, count(*) as i from t group by id) as il on il.id = t.id
where
   i = 1 or (i>1 and wartosc>0)

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