Zapytanie SQL dla kilku warunków

0

Cześć wszystkim,

Mam problem z zapytaniem SQL poniżej tabela jaką dysponuję(tylko kilka rekordów)

from_subscriber to_subscriber datetime duration celltower
0 1 2006-06-01 0500 1835 7
1 200 2006-06-01 0700 1454 29
3 200 2006-06-01 0300 1129 30
6 254 2006-06-01 0400 1264 29
7 253 2006-06-01 0600 1205 29

Próbuje zapytać tabele o sume sekund połączeń dla poszczególnych nadawców:

SELECT SUM( duration ) AS suma FROM polaczenia WHERE from_subscriber =392
Powyższe działa poprawnie jednak daje mi tylko wynik dla jednego dzwoniącego a ja np chce to zrobić dla 3 i mieć trzy wyniki.

Próbuję poniższym sposobem ale daje to wartość NULL.
SELECT SUM( duration ) AS suma FROM polaczenia WHERE from_subscriber =392, from_subscriber =47, from_subscriber =209

Muszę jeszcze zadać zapytanie do bazy o taki wynik ( ’ 2006 -06 -01 T05 00 ’, ’ 2006 -06 -01 T07 00 ’) , jak wiem jest to czas ostatniego połączenia odebranego przez dwóch danych odbiorców ale nie wiem jak się za to zabrać.

Proszę Was o wsparcie.

0

Użyj GROUP BY (from_subscriber) zamiast where.

0

Gdy daje:
SELECT SUM( duration ) AS suma
FROM polaczenia
GROUP BY from_subscriber =392, from_subscriber =47, from_subscriber =209

Otrzymuje inne wyniki niż jakie otrzymuje z pojedynczego zapytania o sumę.

1
SELECT SUM( duration ) suma FROM polaczenia WHERE from_subscriber in (392, 47, 209) group by from_subscriber

i polecam jakiś kurs podstaw sql

0

Wykonuję zapytanie:
SELECT SUM( duration ) suma FROM polaczenia WHERE from_subscriber IN (47, 209, 392) GROUP BY from_subscriber

Niestety wyniki które otrzymuję nie są takie jakie powinny być :/ Dodam że podczas pojedyńczego zapytania o sumę dla danego dzwoniącego wyniki wychodzą poprawne.
Wyniki które powinienem uzyskać:
2099 , 2073 , 2058

Wyniki,które otrzymuję:
7587, 3592 , 2058

PS. Jestem właśnie na takim kursie :)

2

Zapytanie które dał Ci Paweł Dmitruk powinno działać.Jeżeli chcesz konkretnej pomocy to daj konkretny przykład z konkretnymi danymi.Co z tego, że dajesz dane dla from_subscriber 47, 209, 392 i mówisz "powinienem otrzymac". Na jakiej podstawie to mówisz, powinieneś bo? My tych danych nie widzimy, powiedz co chciałbyś otrzymać dla danych które podałeś przy konretnym zapytaniu, a najlepiej stwórz sqlfiddle.

from_subscriber     to_subscriber         datetime         duration    celltower
    0                      1          2006-06-01 05:19:00    1835                  7
    1                   200          2006-06-01 07:21:00    1454                  29
    3                   200          2006-06-01 03:59:00    1129                  30
    6                   254          2006-06-01 04:54:00    1264                  29
    7                   253          2006-06-01 06:38:00    1205                  29


Pozdrawiam

0

@Mikajlo8 myślę, że masz rację.

Dodaję załącznik polaczenia.sql.zip z bazą danych, na której pracuję i zaczynając od początku piszę o co mi chodzi.

Chcę otrzymać dwie rzeczy:

  • pierwsza to suma sekund połączeń dla poszczególnych nadawców(from_subscriber)
    W celu sprawdzenia czy dobrze robię wyniki mam testować dla nadawców (47 , 209 , 392) i wynik powinien być następujacy:(2099 , 2073 , 2058)

  • druga to czas ostatniego połączenia odebranego przez odbiorców(to_subscriber)
    W drugiej części wyniki mają być testowane za pomocą odbiorców (5 , 42) i otrzymane informacje powinny być zgodne z: (2006 -06 -01 T05 00, 2006 -06 -01 T07 00)

Wiem, że pisząc wynik jest zły, błędny, inny niż ten co powinien być jestem trochę irytujący za co przepraszam.

2

Zrób sobie selecta wszystkiego dla from_subscriber = 47 i zobaczysz, że czas taki jak podajesz nie jest możliwy. Więc albo chodzi o coś innego w tym pierwszym zadaniu albo masz złe odpowiedzi.
Edit:
Po szybkiej analizie wygląda na to, że w pierwszym zadaniu wyniki są dobre dla sumy minut dla poszczególnych from_subscriber ale tylko dla rozmów dnia 01-06-2006.

0

Masz rację @szweszwe wyniki są inne niż te co podałem.
Jedynie dla: SELECT SUM( duration ) AS suma FROM polaczenia WHERE from_subscriber =392 wynik jest poprawny i daje 2058.

Niestety mamy zdalny dostęp do bazdy danych i każdy mógł coś przestawić.

0

Wydaje mi się, że w tym wypadku najlepsze będzie stworzenie zapytania bez sprawdzania czy daje poprawne wyniki z tym co napisałem wyżej bo i tak takie nie będą.

0

W drugim zapytaniu wynik też inny...
bde608a6e6.png

Z ciekawości, to na studia?

0

@Mikajlo8 tak o na studia, podstawy podstaw sql.

Proszę nie opieraj się na tych wynikach bo na 95% ktoś edytował bazę i dodał jakieś rekordy, więc w tym momencie liczy się tylko zapytanie.

1

No to zapytanie masz wyżej, tutaj masz wersje tekstową:

select p1.to_subscriber,
(Select max(datetime) dated
from polaczenia p2
where p2.to_subscriber=p1.to_subscriber) n
from polaczenia p1
where p1.to_subscriber in (42,5)
group by p1.to_subscriber

lub wersja z distinct:

select distinct p1.to_subscriber,
(Select max(datetime) dated
from polaczenia p2
where p2.to_subscriber=p1.to_subscriber) n
from polaczenia p1
where p1.to_subscriber in (42,5)
0

Dziękuję Wam chłopaki @szweszwe @Mikajlo8 @Paweł DmitrukDmitruk za pracę nad kodem i każdemu kto chociażby zerknął na zapytanie.

Pozdrawiam

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