Zadanie w ms sql - jak zrobić?

Zadanie w ms sql - jak zrobić?
Inka Rozmowna
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:6
0

Witam Was bardzo serdecznie.

Piszę bo mam problem z poniższą kwestią.

Mam następującą tabelę
screenshot-20171115180115.png

Muszę przygotować zestawienie pokazujące wizyty klientów:
Ilu klientów miało ile wizyt,z ich chronologicznym porządkiem (z uwzględnieniem dat).
Chodzi o wszelkie możliwe kombinacje wizyt i ilość pacjentów, którzy byli u lekarzy właśnie w takiej kolejności wizyt

np.
4 wizyty
w kombinacji
screenshot-20171115174944.png
(wynik 1 pacjent)

3 wizyty
dwie kombinacje
screenshot-20171115175254.png

2 wizyty
dwie kombinacje
screenshot-20171115175759.png

Jak to zrobić? Możecie pomóc?

edytowany 2x, ostatnio: Inka Rozmowna
Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 14 godzin
  • Postów:2792
0

Jest jeszcze jakąś kolumna? Jakieś ID czy coś...

Inka Rozmowna
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:6
0

Nie. Praktycznie tylko to. Mamy wziąć pod uwagę wizyty przypadające na każdą osobę, więc po peselach.

abrakadaber
abrakadaber
  • Rejestracja:prawie 13 lat
  • Ostatnio:9 miesięcy
  • Postów:6610
0

powiem szczerze, że nie łapie zależności czemu tak a nie inaczej prezentują się wyniki


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
KL
A bo wymaganie jest opisane średnio. Wyniki to jednocześnie jest dokładny opis kombinacji danych na wyjściu - dlatego też 4 wizyty u podanych lekarzy ma tylko jeden pacjent - Anna Buc. W pozostałych jest identycznie. Generalnie trzeba patrzeć po wizytach u lekarzy, później patrzeć jakie występują pesele i składać kombinacje... Tzn. Nie całkiem tak do końca, ale w sumie byłoby to jedno z rozwiązań. Można też szukać odwrotnie, pesel -> wizyty i wypisywać kombinacje, wydaje się bardziej intuicyjne i idiotoodporne.
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 2 godziny
  • Postów:3882
0

Poszedłnym w coś w ten deseń:

Kopiuj
with ctes as (
select 
    pesel
from (select 
          * 
          ,row_number() over (partition by pesel order by data_skier) r
      from 
          wizyty) w
      left join (values 
                     (1,'Pediatra')
                     ,(2,'Gastrolog')
                     ,(3,'Ginekolog')
                     ,(4,'Internista')
                ) as S(r,l) on s.r=w.r and s.l=w.lekarz
group by 
    pesel
having 
    count(s.r)=4
 )
 
 
 select 
  'Pediatra->Gastrolog->Ginekolog->Interista' as Sekwencja
  ,count(distinct pesel) IloscPacjentów
from ctes

Generalnie musisz jakoś zdefiniować sekwencje które szukasz, to przykłąd jak znaleźć pierwszą z podanych http://sqlfiddle.com/#!6/309fd/14

PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 2 godziny
  • Postów:3882
0

Jeżeli jednak potrzebujesz jednym zapytaniem to wyciągnąć, to trzeba stworzyć tabelę która opisze sekwencje występowania i podać wynik tak:

Kopiuj
with ctes as (
select
    s.*
    ,w.pesel
    ,w.r wr
from 
    s 
    left join (select 
          * 
          ,row_number() over (partition by pesel order by data_skier) r
      from 
          wizyty) w
     on s.r=w.r and s.lekarz=w.lekarz )
 , cteAgg as ( 
select 
    id
    ,pesel 
from 
    ctes
group by 
    id
    ,pesel
 having 
    count(wr)=max(ilosc)
 )
 
 select id, count(distinct pesel) IlePacjentow from cteagg
 group by id

http://sqlfiddle.com/#!6/d928f/11

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.