Witam,
Prośba o pomoc w rozwiązaniu problemu. Problem opisałem w załączniku.
Z góry bardzo dziękuję.
Skoro to jest Access to udostenij plik accdb/mdb...
Co do pytania to chyba zostaje to zrobić unionem, cos w ten deseń
Select user.name, "Komputer" Typ, nrfabryczny from user left join komputery
Union all
Select user.name, "Monitor", nrfabryczny from user inner join monitory
Masz źle zaprojektowaną bazę.
Co będzie jeśli do monitora i komputera będziesz musiał dodać myszkę albo klawiaturę ? utworzysz dwie nowe tabele "klawiatury" i "myszki" ??
Zakładając że jedno urządzenie ma jednego użytkownika to
widział bym trzy tabele. To tak w skrócie, bo nie chce mi się rysować diagramów
- Użytkownicy (UserID, FirstName, LastName .......)
- Urządzenia (DeviceId, UserID, CategoryId, Name, SerialNumber,.....)
- Kategorie urządzeń (CategoryId,Descrption, .....)
Panczo napisał(a):
Skoro to jest Access to udostenij plik accdb/mdb...
Co do pytania to chyba zostaje to zrobić unionem, cos w ten deseń
Select user.name, "Komputer" Typ, nrfabryczny from user left join komputery Union all Select user.name, "Monitor", nrfabryczny from user inner join monitory
Za pomocą Union all wynik jest ok, tylko wszystkie dane są wyświetlane w 2 kolumach (Użytkownik i Komputer). Chodziło mi bardziej o to, żeby były 3 kolumny (Użytkownik, Komputer, Monitor). Mając 2 komputery a 1 monitor, żeby w kolumnie Monitory był 1 rekord z danymi monitora a 2gi pusty.
żeby w kolumnie Monitory był 1 rekord
w kolumnie nie możesz mieć rekordu
podaj jak przykładowo ma wyglądać wynik zapytania
Użytkownik Komputer Monitor
Jan Kowalski Dell …. Del ….
Jan Kowalski HP ……
Adam Nowak Dell …. Del ….
Daj plik z danymi
w jakim celu tworzysz dwie bezsensowne tabele "monitory" i "komputery" ???
czy nie lepiej zrobić z tego jedną tabele, dodając do niej pole typUrzadzenia
, a w nim "monitor" albo "komputer", kiedyś może "myszka' albo "klawiatura" ??
wtedy w zapytaniu odpadnie Ci zupełnie niepotrzebny union
przemyśl jeszcze raz strukturę bazy, bo obecna ma wiele wad
Baza w załączeniu.
grzegorz_so napisał(a):
w jakim celu tworzysz dwie bezsensowne tabele "monitory" i "komputery" ???
czy nie lepiej zrobić z tego jedną tabele, dodając do niej poletypUrzadzenia
, a w nim "monitor" albo "komputer", kiedyś może "myszka' albo "klawiatura" ??
wtedy w zapytaniu odpadnie Ci zupełnie niepotrzebnyunion
przemyśl jeszcze raz strukturę bazy, bo obecna ma wiele wad
Tak, jak pisałem wcześniej, dopiero zaczynam tą przygodę a muszę zrobić małą bazę sprzętu. Komputer i monitor to tylko 2 urządzenia z wielu. Zrobię tak, jak proponujesz, jakoś nie wpadłem na taki pomysł. Dziś już nie dam rady, ale jutro dam znać co z tego wyszło. Dziękuję bardzo.
jeśli będziesz przebudowywał bazę , to pole typUrzadznia
zdefiniuj jako INT . Możesz np przyjąć że komputer ma wartość 1, monitor 2, itp itd ... a same opisy kategorii wstawić do tabeli słownikowej
1,komputer
2,monitor
3,myszka
4,klawiatura
5,drukarka
........
przy większych tabelach takie rozwiązanie jest wydajniejsze
Sprawa, nie jest tak prosta, jak się wydaje, każdy join powieli rekordy w przypadku łączenia dwóch tabel do jednej, tak naprawdę to trzeba przygotować dane, aby mieć jakiś wyróżnik. potrzebujemy w każdej tabeli lp w ramach id_uż, sam access nie wspiera w żaden sposób tworzenia lp w grupowaniu ale to mozna obejśc tak:
Kwernda sprzet:
SELECT
u.użytkownik
,s.*
FROM (
SELECT
"Komputer" as Typ
,k.Producent & " " & k.Model & "," & k.Nr_fabryczny as nazwa
,k.Id_Uż
,count(*) AS lp
FROM
komputery AS k
INNER JOIN komputery AS k1 ON (k.identyfikator <= k1.identyfikator) AND (k.id_uż = k1.id_uż)
GROUP BY
k.Producent & " " & k.Model & "," & k.Nr_fabryczny
,k.Id_Uż
UNION ALL
SELECT
"Monitor" as Typ
,m.Producent & " " & m.Model & "," & m.Nr_fabryczny
,m.Id_Uż
,count(*) as lp
FROM
Monitory AS m
inner join monitory as m1 on m1.id_uż=m.id_uż and m.identyfikator <= m1.identyfikator
group by
m.Producent & " " & m.Model & "," & m.Nr_fabryczny
,m.Id_Uż) AS S
INNER JOIN użytkownicy as u on u.id_uż=s.id_uż
W wyniku mamy to:
użytkownik | Typ | nazwa | Id_Uż | lp |
---|---|---|---|---|
Adam Nowak | Komputer | DELL 980, RTN7812TY5 | 2 | 2 |
Jan Kowalski | Komputer | DELL 990, RTY897562LK | 1 | 1 |
Zenon Przykład | Komputer | FUJITSU T769, 45SNGH6J55JJHH | 3 | 1 |
Jan Kowalski | Komputer | HP 8200, CZC256GF7 | 1 | 2 |
Adam Nowak | Komputer | HP 8400, 43DFR89JK | 2 | 1 |
Jan Kowalski | Monitor | DELL 24F65, 4FR5OM9 | 1 | 1 |
Zenon Przykład | Monitor | DELL 44RTY7, 4TYVBFR45 | 3 | 1 |
Jan Kowalski | Monitor | HP 32Z45201, 4398HPTR56 | 1 | 2 |
Adam Nowak | Monitor | HP 32Z45201, 5455HTYU54 | 2 | 1 |
No i teraz, pokazanie w sposób jaki chcesz, do tego można użyć PIVOT (kwerenda sprzet_krzyżowa):
TRANSFORM First(sprzet.[nazwa]) AS PierwszyOfnazwa
SELECT
sprzet.[użytkownik]
FROM
sprzet
GROUP BY
sprzet.[użytkownik], sprzet.[lp]
PIVOT
sprzet.[Typ];
Wynik:
użytkownik | Komputer | Monitor |
---|---|---|
Adam Nowak | HP 8400, 43DFR89JK | HP 32Z45201, 5455HTYU54 |
Adam Nowak | DELL 980, RTN7812TY5 | |
Jan Kowalski | DELL 990, RTY897562LK | DELL 24F65, 4FR5OM9 |
Jan Kowalski | HP 8200, CZC256GF7 | HP 32Z45201, 4398HPTR56 |
Zenon Przykład | FUJITSU T769, 45SNGH6J55JJHH | DELL 44RTY7, 4TYVBFR45 |
To pokazuje, ze sie da, ale nie ma to wielkiego sensu, to powinieneś rozwiazać raportem accessowym w z podraportami....
Dziękuję bardzo za pomoc przy tworzeniu mojej bazy sprzętu. Tabele już stworzone i kwerendy działają jak powinny, ale mam jeszcze jedno pytanie. Czy istnieje taka możliwość, żeby wynikiem kwerendy był sprzęt danego użytkownika. Chodzi mi o to, aby po uruchomieniu kwerendy, program poprosił o wprowadzenie żądanego użytkownika i dopiero wyświetlił tabelę z jego urządzeniami.
SELECT * FROM sprzet WHERE id_uzytkownika=[Podaj ID uzytkownika]
chyba również można zdefiniować PARAMETRES przed SELECT, ale to można wykikać we właściwościach