MS SQL Zapytanie o wyszukiwanie towarów z datą

0

Witam,

Jestem nowym użytkownikiem i dopiero uczę się SQL'a i prosił bym o pomoc:

Mam za zadanie napisać skrypt który wyznaczy przez ile dni były wypożyczone samochody poszczególnych marek w kolejnych latach. Całość jest w 2ch tabelach w tym trzeba porównać daty wypożyczenia i oddania samochodu które są w formacie rok-miesiac-dzien, próbowałem DATEDIFF(day,'data_wypozyczenia','data_oddania'), ale jakoś nie chce iść. Dodatkwo jak mogę wyznaczyć z dat "kolejne lata" ?

0

Pokaż strukturę tabel i to, co już sam napisałeś.

0

Napisałem coś takiego (tak wiem że źle, ale innego pomysłu na razie nie mam jak to ugryźć)

SELECT DISTINCT Marka
FROM dbo.SAMOCHODY LEFT OUTER JOIN dbo.WYP ON dbo.SAMOCHODY.NR_SAMOCHODU=dbo.WYP.NR_SAMOCHODU
WHERE DATEDIFF ( 'day', 'DATA_WYP', 'DATA_ODD')

Chciałem zliczyć różnicę w datach i za pomocą polecenia count wyliczyć ile dni były wypożyczone poszczególne modele... ale mam wrażenie że DATEDIFF źle używam

0

Napisałeś, że chcesz policzyć liczbę dni. Dlaczego zatem dałeś datediff w warunku, a nie w select? Przecież chcesz zsumować to co zwróci datediff, a nie wyświetlać rekordy na podstawie ilości... Po drugie masz w zadaniu zwrócić sumy dla poszczególnych marek zatem musisz grupować po marce.

0

Po pierwsze, twórz aliasy na tabele. Będzie Ci się przyjemniej pracowało.

Apostrofy nie powinny się tam pojawić, chcesz podać wartość kolumny DATA_WYP a nie ciąg znaków 'DATA_WYP' oraz atrybut day.

WHERE DATEDIFF ( day, DATA_WYP, DATA_ODD) 
0

Tak też to zauważyłem przed chwilą, oczywiście

SELECT DISTINCT Marka, DATEDIFF ( day, DATA_WYP, DATA_ODD)
FROM dbo.SAMOCHODY LEFT OUTER JOIN dbo.WYP ON dbo.SAMOCHODY.NR_SAMOCHODU=dbo.WYP.NR_SAMOCHODU
GROUP BY MARKA, Data_WYP, Data_ODD

Coś takiego mam,ale czy dobrze ?

Dziękuję za rady

Dopiero raczkuję w SQL więc przepraszam za brak wiedzy ;)

Vardamir napisał(a):

Po pierwsze, twórz aliasy na tabele. Będzie Ci się przyjemniej pracowało.

Apostrofy nie powinny się tam pojawić, chcesz podać wartość kolumny DATA_WYP a nie ciąg znaków 'DATA_WYP' oraz atrybut day.

WHERE DATEDIFF ( day, DATA_WYP, DATA_ODD) 

Ok, ale jak podać te wartości ? Co wpisać żeby było dobrze ? Jeżeli nie atrybut day to co ?

0

Obawiam się, że ty nawet nie rozumiesz co masz zrobić :/ Korzystanie z forum nie oznacza, że można wyłączyć myślenie.

0
tauosu napisał(a):

Ok, ale jak podać te wartości ? Co wpisać żeby było dobrze ? Jeżeli nie atrybut day to co ?

Wpisać trzeba to czego oczekuje funkcja DATEDIFF. Tak jak ja napisałem zadziała. Zawsze jak masz wątpliwości (choć jeśli pracujesz w ssms to jest podpowiadaczka) to możesz sprawdzić na stronie z dokumentacją.

0
Krzywy Kot napisał(a):

Obawiam się, że ty nawet nie rozumiesz co masz zrobić :/ Korzystanie z forum nie oznacza, że można wyłączyć myślenie.

Jakbym to rozumiał to bym nie prosił o pomoc, myślenie nie ma tutaj nic do tego - Ty możesz rozumieć SQL bo się tym zajmujesz/zajmowałeś, Ja nie miałem z nim do czynienia.

Najpierw zrób "zwykłego" SELECTa. Niech wyświetla ci, to co potrzebne do sumowania. Sumowaniem zajmiesz się później

Ok, czyli po prostu:

SELECT DATEDIFF (day, DATA_WYP, DATA_ODD)
FROM dbo.WYP

Wypisuje mi wszystkie dane, co dalej powinienem zrobić ? Ewentualnie jakiś dobry kurs moglibyście polecić ?

0

Sama tabela "wyp" nie wystarczy, przecież masz pogrupować po markach.

Twój poprzedni post utwierdził mnie jeszcze bardziej w przekonaniu, że ty w ogóle nie używasz mózgu. Jedynie bezmyślnie piszesz to co zrozumiałeś z forum... Szkoda tylko, że nie rozumiesz odpowiedzi, które otrzymałeś. Wszystkie informacje już dostałeś, teraz wyłącz forum i się zastanów!

0

Nie zasłaniaj się nieznajomością SQL, ponieważ tu chodzi o logiczne myślenie. Zapomnij na chwilę o SQL i napisz sobie jasno co chcesz policzyć i na logikę pomyśl jak to policzyć!

Masz dwie daty. Słusznie zauważyłeś, że odejmując jedną od drugiej otrzymasz ilość dni. Tylko, że dostajesz dni dla pojedynczego wypożyczenia, a chcą od ciebie ilości dni dla marki i roku. Teraz coś musisz z tymi dniami zrobić!

Dostajesz np.

mazda, 5 dni
mazda, 10 dni
ford, 3 dni
ford, 3 dni

Co musisz zrobić z tymi dniami, żeby otrzymać to co chcę od ciebie w poleceniu? Włącz myślenie OMG!!!

0
Krzywy Kot napisał(a):

Sama tabela "wyp" nie wystarczy, przecież masz pogrupować po markach.

Twój poprzedni post utwierdził mnie jeszcze bardziej w przekonaniu, że ty w ogóle nie używasz mózgu. Jedynie bezmyślnie piszesz to co zrozumiałeś z forum... Szkoda tylko, że nie rozumiesz odpowiedzi, które otrzymałeś. Wszystkie informacje już dostałeś, teraz wyłącz forum i się zastanów!

Dlatego się pytam JAK to zrobić, bo nie umiem po prostu. Bez prywatnych wycieczek bym prosił, przez ekran każdy jest mocny... Robię to co bardziej doświadczeni każą by naprowadzić mnie na rozwiązanie, patrz komentarze do postu wyżej...

Krzywy Kocie - Ja wiem co mam zrobić, nie wiem tylko jak to zapisać

Mam liczbę dni, mam nr samochodu - teraz jak połączyć nr samochodu z Marką z 2ch tabel i z liczbą dni która pokazała mi się z DATADIFF - z tym mam problem

SELECT DATEDIFF (day, DATA_WYP, DATA_ODD) AS DNI_WYP, dbo.SAMOCHODY.MARKA
FROM dbo.WYP FULL OUTER JOIN dbo.SAMOCHODY ON dbo.WYP.NR_SAMOCHODU=dbo.SAMOCHODY.NR_SAMOCHODU

Zwraca mi ilosc dni wypożyczonych i markę, jednak jak teraz zgrupować całość i lata ?

Dodanie GROUP BY MARKA, YEAR(DATA_WYP) nie działa

0

Miałeś już prawie gotowe zapytanie w drugim poście! Zamiast pomyśleć, doczytać co z czym, to ty marnujesz czas na forum, próbujesz zinterpretować jakieś bzdurne podpowiedzi i się jeszcze kłócisz ze mną chociaż mam 100% racji. Więcej pokory!

Nawet jak połączysz wypożyczenie z marką, to nadal będziesz miał pojedyncze dni wypożyczenia. Rusz mózgownicą i zastanów się co musisz zrobić z tymi dniami, żeby mieć dni dla marki. Pisałem ci już, żebyś to rozwiązał bez SQL-a, na logikę. Nie zrobiłeś tego... Zastanów się co masz zrobić, rozłóż to na czynniki pierwsze i później włącz GOOGLE albo zapytaj na forum. Wtedy rozwiązanie okaże się proste i łatwe. Teraz nie wiesz co robisz i jak robisz, tylko marnujesz czas swój i nasz.

1
tauosu napisał(a):

Zwraca mi ilosc dni wypożyczonych i markę, jednak jak teraz zgrupować całość i lata ?

Dodanie GROUP BY MARKA, YEAR(DATA_WYP) nie działa

Pomyśl na logikę!!! Pisałem już:

mazda, 7 dni
mazda, 10 dni
ford, 3 dni
ford, 3 dni

Weź pomyśl co masz z tego uzyskać i jak do tego dojść. Napisz jaka jest odpowiedź dla podanego powyżej przykładu i jak do niej doszedłeś. Jak masz w SELECT DATEDIFF to się nie dziw, że GROUP BY nie działa. W GROUP BY musisz mieć te same pola co w SELECT nie licząc pól w funkcjach agregujących, a funkcje agregujące to: COUNT, SUM, MIN, MAX itd.

Czyli jak masz zapytanie:
SELECT pole1, pole2
FROM tabela1

To w GROUP BY musisz mieć: pole1, pole2

Ale jak masz:
SELECT SUM(pole1), pole2
FROM tabela1

To w GROUP BY musisz mieć: pole2. Pole1 nie jest potrzebne, ponieważ jest w funkcji agregującej.

0
Krzywy Kot napisał(a):
tauosu napisał(a):

Zwraca mi ilosc dni wypożyczonych i markę, jednak jak teraz zgrupować całość i lata ?

Dodanie GROUP BY MARKA, YEAR(DATA_WYP) nie działa

Pomyśl na logikę!!! Pisałem już:

mazda, 7 dni
mazda, 10 dni
ford, 3 dni
ford, 3 dni

Weź pomyśl co masz z tego uzyskać i jak do tego dojść. Napisz jaka jest odpowiedź dla podanego powyżej przykładu i jak do niej doszedłeś. Jak masz w SELECT DATEDIFF to się nie dziw, że GROUP BY nie działa. W GROUP BY musisz mieć te same pola co w SELECT nie licząc pól w funkcjach agregujących, a funkcje agregujące to: COUNT, SUM, MIN, MAX itd.

Czyli jak masz zapytanie:
SELECT pole1, pole2
FROM tabela1

To w GROUP BY musisz mieć: pole1, pole2

Ale jak masz:
SELECT SUM(pole1), pole2
FROM tabela1

To w GROUP BY musisz mieć: pole2. Pole1 nie jest potrzebne, ponieważ jest w funkcji agregującej.

Tego mi właśnie brakowało, dziękuję za odpowiedź. Zgrupowało mi ładnie Ilość dni wypożyczonych do Marki.

Już dodałem też kolejność w latach.

Dobrze wiedzieć że nie jestem bezmózgim,a tylko brak mi wiedzy z SQL :)

1

Brawo! Uwierz mi, że programowanie nie polega na znajomości języków programowania czy pisania zapytań SQL. Programowanie polega na analizowaniu i rozwiązywaniu problemów. SQL to tylko narzędzie.

Może używałem dosadnego języka, ale chciałem ciebie zmotywować do samodzielnego rozwiązania problemu. Udało się, skojarzyłeś prawidłowo fakty i masz gotowe rozwiązanie.

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