Wygenerowanie nowej kolumny SQL Kwerenda

Odpowiedz Nowy wątek
2014-11-03 15:08
0

Mam taki problem zastanawiam się jak stworzyć kwerendę: (oczywiście trochę zmniejszam ilość atrybutów, ponieważ chciałbym zrozumieć ideę)

Mam dwie tabele:

  1. Osoba - IdOsoby, Nazwisko, DataUrodzenia, Płeć, #IdFirmy, #IdS
  2. Firma - IdFirmy, Nazwa.
  3. Stanowisko - IdS, #IdFirmy

Teraz Kwerenda wypisująca Nazwisko, Nazwę Firmy, W 3 kolumnie chciałbym otrzymać w zależności od stanowiska pierwszą literę tego stanowiska, 4 kolumna powinna pokazać 0 lub 1 w zależności od tego czy osoba urodziła się przed czy po 1.01.1980 rok.

Kompletnie nie mam pomysłu na to o ile Nazwisko i Nazwę firmy nie ma problemu z wypisaniem o tyle 3 i 4 kolumna jest dla mnie totalną zagadką. Proszę o pomoc.

Pozostało 580 znaków

2014-11-03 15:11
Ldr
1

Ale nie ucz sie na accesie.

Rzeczy których potrzebujesz
Substring
case when

Do pierwszego wystarczy funkcja LEFT :) - Vardamir 2014-11-03 15:23
Wystarczy, ale w sumie nie wiem czy wszystkie dialekty go wspierają :) - Ldr 2014-11-03 15:29
Rozpoznałeś, że Access, a nie wiesz, że nie ma Case When.. :) - Marcin.Miga 2014-11-03 15:42
Dokładnie! - Ldr 2014-11-03 15:54

Pozostało 580 znaków

2014-11-03 15:27
0

join, substring, case może też (słowa do wpisania w wyszukiwarkę :) ). Zwrócę jeszcze tylko uwagę, że napisałeś "w zależności od tego czy osoba urodziła się przed czy po 1.01.1980 rok", więc nie wiadomo co zrobić z osobą, która urodziła się dokładnie 01.01.1980... ;-)

edytowany 1x, ostatnio: fourfour, 2014-11-03 15:28

Pozostało 580 znaków

2014-11-03 22:12
0

IIf(Osoba.DataUrodzenia > #1980-01-01#,1,0) AS Kolumna

Wydaje mi się, że to spełnia moje warunki co do kolumny numer 4, ale jeszcze moje pytanie jest inne. Tak działam na Accesie póki co ;).

Co do tego zadania jeszcze chciałbym nieco skomplikować ;), co miałbym zrobić jeśli chciałbym do nowej kolumny dodać następujące rzeczy:
0 dla osób z datą urodzenia poniżej 1.1.1980
1 dla osób z datą pomiędzy 1.1.1980 do 1.1.1990
2 dla osób z datą powyżej 1.1.1990

tutaj przydałoby się If else albo Switch, a jak kolega napisał nie ma Case When ;) jak zatem rozbudować tą część zapytania żebym mógł spełnić moje warunki ?

Dziękuję za pomoc :)

Edit: Udało się :p

SELECT Switch (Osoba.Data<#1/1/1980#, '0', Osoba.Data>#1/1/1980# AND Osoba.Data<#1/1/1990#, '1', Osoba.Data>#1/1/1990#, '2') AS Limit, Firma.Identyfikator, Firma.[Nazwa Firmy], Osoba.Imie, Osoba.Nazwisko, Osoba.Data AS Data

To jest okej czy można to bardziej optymalnie zrobić ?

A i rozwiązanie dla pierwszej litery stanowiska:

SELECT Mid(Stanowisko.[Nazwa Stanowiska], 1, 2) AS Kolumna

próbowałem z SUBSTRING, ale jakiś błąd się pojawia.

edytowany 2x, ostatnio: Patryk_1425, 2014-11-03 22:30

Pozostało 580 znaków

2014-11-03 23:36
3

Dobra rada - zapomnij o Access. JET SQL jest niepodobny do niczego i z niczym niezgodny. Tylko ogólne zapytania będą działać. Szczegółowe (bardziej skomplikowane) - będą pisane zupełnie inaczej, niż w innych dialektach. No, chyba że chcesz się z Accessem związać na lata... Chcesz coś małego, jednoplikowego - użyj SQLite - jest mnóstwo świetnych narzędzi. (a ze standardu to chyba tylko RIGHT JOIN nie ma).
No i zapomnij o spacjach, PLiterkach i innych "wynalazkach" w nazwach obiektów bazy danych...

Pozostało 580 znaków

2014-11-04 09:55
0

Okej, dzięki za odpowiedź i wskazówki. Jestem początkujący jako SQLowiec i dlatego robię proste błędy, ale staram się poprawiać ;).
Jeszcze ostatnie pytanie odnośnie takiego zadania.

Mam tabelę Pracownik z atrybutami IdP, Nazwisko, Imie
Druga tabela Zatrudniony IdZ, Stanowisko, #IdP

I teraz moim zadaniem jest otrzymać pracowników zatrudnionych.

SELECT Pracownik.Nazwisko, Pracownik.Imie FROM Pracownik
INNER JOIN Zatrudniony ON Pracownik.IdP < > Zatrudniony.IdP;

RIGHT JOIN Zatrudniony ON Pracownik.IdP = Zatrudniony.IdP;

Czy ten sposób będzie poprawny czy można to zrobić jeszcze inaczej ?

EDIT: Nierówność, ponieważ chciałbym wypisać tylko tych zatrudnionych, chociaż teraz myślę, że RIGHT JOIN byłby idealny do tego ;)

edytowany 2x, ostatnio: Patryk_1425, 2014-11-04 10:07
Pracownik.IdP < Zatrudniony.IdP dlaczego tu nierówność? - Vardamir 2014-11-04 10:00

Pozostało 580 znaków

2014-11-04 10:32

Skoro chcesz wypisać tylko zatrudnionych to chyba warunkiem zatrudnienia jest istnienie w tabeli Zatrudniony rekordu z IdP. Wiesz jakie są różnice między RIGHT i INNER ?


"There are people who actually like programming. I don't understand why they like programming."
Rasmus Lerdorf

Pozostało 580 znaków

2014-11-04 13:04
0

SELECT Pracownik.Nazwisko, Pracownik.Imie, Zatrudniony.Firma
FROM Zatrudniony LEFT JOIN Pracownik ON Zatrudniony.IdP = Pracownik.IdP;

SELECT Pracownik.Nazwisko, Pracownik.Imie
FROM Zatrudniony INNER JOIN Pracownik ON Zatrudniony.IdP = Pracownik.IdP;

Dzięki za podpowiedź ;)

Pozostało 580 znaków

2014-11-08 10:50
Patryk1234
0

Mam pytanie tego typu. Czy baza firebird i mysql mają ta sama skladnie jezyka sql ?
I czy znajde jakiegoś darmowego nie wymagają cego rejestracji klienta do firebirda

Pozostało 580 znaków

2014-11-08 18:26
0

Jeszcze, żeby nie zakładać nowego tematu , jaki będzie najlepszy tutorial do nauki MySQL, może być pdf albo youtube bez różnicy dla mnie. Co proponujecie ?

Pozostało 580 znaków

2014-11-10 22:40
0

Czy osoby, które wykorzystują bazę Firebird, mogą polecić dobry tutorial dla początkującej osoby

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