Zapytanie SQL

Odpowiedz Nowy wątek
2019-05-13 22:06
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.

Pozostało 580 znaków

2019-05-13 22:09
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;

Pozostało 580 znaków

2019-05-13 23:05
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;

Pozostało 580 znaków

2019-05-14 08:06
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().

Pozostało 580 znaków

2019-05-14 08:23
0

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

MS Accessa nie znam i nie umiem ;) - yarel 2019-05-14 08:56

Pozostało 580 znaków

2019-05-14 09:06
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)
edytowany 1x, ostatnio: Panczo, 2019-05-14 09:06
Nie jestem pewien czy model OPa pozwala na wiele rekordów z wartością 0 per id, ale to raczej drobna rzecz. - yarel 2019-05-14 09:52
Wg. opisu takich rekordów nie chce w wyniku... - Panczo 2019-05-14 09:54
To niepewność odnośnie mojej propozycji, bo tam tego nie uwzględniłem ;-) - yarel 2019-05-15 08:23

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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