zsumowanie wybranych wierszy tabeli?

0

Witam, mam problem z wykonaniem jednego zapytania do bazy. Nie mam jej w tej chwili przed sobą ale postaram się to możliwie dokładnie wytłumaczyć.

Mam tabelę zawierającą ponad 9 milionów rekordów. kolumn też jest dużo, ale kluczowych dla mnie jest kilka z nich. wygląda to mniej więcej tak:

| id | pesel | status_konta |

id jest unikatowe, a numer pesel moze się powtarzać. tak jakby jeden użytkownik miał kilka kont. Zadanie polega na tym, że muszę policzyć powtarzające się numery pesel i zestawić je w formie tabeli pokazującej ile numerów pesel powtarza się ile razy z podziałem na status konta. Wiem, że nie brzmi to jasno więc pokażę na rysunku jak ma wyglądać docelowa tabela:

tabela1
1da5ed3e6d.png

Póki co udało mi się stworzyć podzapytanie, które zliczy numery pesel i wyświetli ich liczbe w formie: | l_wyst | pesel | status |. W tym podzapytaniu jest również CASE który wyświetla "1" dla statusu aktywnego, "0" dla każdego innego statusu i to pole CASE jest później sumowane, dzięki czemu widzę ile statusów jest aktywnych. Następnie utworzyłem dla niego (nad)zapytanie, które wyswietla ilość powtórzeń oraz ilość wystąpień. W tej chwili moja tabela wygląda mniej więcej tak:

tabela2
7fbc288d30.png

Teraz chodzi o to, żeby te wiersze gdzie w kolumnie "il_powt" występuje "2" pozostały bez zmian, a pozostałe gdzie jest 3,4,5,itd zostały zsumowane i wyglądały tak jak na rysunku pierwszym. Jestem bardzo początkujący w temacie SQLa a jutro chciałbym to skończyć. Raport powinien zrobiony podobno w 15 minut ;)

Mam nadzieję, że wytłumaczyłem wystarczająco jasno ;)
Liczę na Waszą pomoc!

1

Tak na szybko, powinno zadziałać tak jak chcesz.

SELECT il_powt, il_wyst, status FROM tabela2 WHERE il_powt=2
UNION
SELECT '>3' AS 'il_powt', SUM(il_wyst) AS 'il_wyst', SUM(status) AS 'status' FROM tabela2 WHERE il_powt>2
0

Niestety sprawdzić będę mógł dopiero jutro jak będę miał dostęp do bazy. ale proszę Cię powiedz jeszcze w którym miejscu powinien znajdować się ten fragment jeśli w tej chwili zapytanie wygląda mniej więcej tak:

SELECT2 coś_tam FROM
(
SELECT1 coś_tam FROM
jakiś CASE
jakiś WHERE
jakiś GROUP
)
jakieś GRUPOWANIE

Nie używałem nigdy operatora UNION, ale patrząc na jego budowę, to zdecydowałbym się edytować SELECT1 a następnie po operatorze GRUPOWANIE podać UNION i drugiego SELECTA, który będzie dołączony. dobrze myślę?

1

Wydaje mi się, że w twoim przypadku dużo prostszym i przyjemniejszym do pracy rozwiązaniem będzie użycie CTE. To pozwoli Ci etapami przetwarzać twoje dane i finalnie łatwo uzyskać tabele do UNION. Daj znać, która forma rozwiązania Ci odpowiada, CTE czy dotychczasowa.

0

UNION wydaje się być prosty i zrozumiały dla mnie. Jeśli oda mi się go skleić z moim dotychczasowym kodem w taki sposób jaki myślę, to powinno mi to wystarczyć. CTE też wygląda ciekawie więc będę chciał się pobawić chociażby żeby zobaczyć jak zadziała. Odezwę się pewnie jutro rano jak przysiąde nad kodem i zaczne dłubać. Póki co dziękuje bardzo za wskazówki!

1

Działa cudownie!

Zastosowałem CTE dzięki czemu nie musiałem, przepisywać drugi raz pierwszego SELECTa. a następnie złączyłem je operatorem UNION. Jedynym problemem okazały się różne typy zmiennych po zmapowaniu wartości kolumny IL_POWT na ">3" ale konwersja na varchar załatwiła sprawe. Był też problem z sortowaniem złączonych kolumn, czego nie potrafiłem zrozumieć bo typ zmiennych był taki sam, ale wystarczyło zamienić kolumny i teraz wszystko wygląda idealnie. Dziękuje pięknie i działam dalej!

EDIT!

Jako ciekawostke dodam jeszcze, że można było to zrobić dużo łatwiej. Mianowicie dodać kolejnego CASEa, który będzie mapował wartości >3. ;)

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