ACCESS podwajanie wyników kwerendy

0

Witam,
Prośba o pomoc w rozwiązaniu problemu. Problem opisałem w załączniku.
Z góry bardzo dziękuję.

0

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
0

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

  1. Użytkownicy (UserID, FirstName, LastName .......)
  2. Urządzenia (DeviceId, UserID, CategoryId, Name, SerialNumber,.....)
  3. Kategorie urządzeń (CategoryId,Descrption, .....)
0
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.

0

żeby w kolumnie Monitory był 1 rekord

w kolumnie nie możesz mieć rekordu
podaj jak przykładowo ma wyglądać wynik zapytania

0

Użytkownik Komputer Monitor
Jan Kowalski Dell …. Del ….
Jan Kowalski HP ……
Adam Nowak Dell …. Del ….

screenshot-20171206205117.png

0

Daj plik z danymi

0

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

0

Baza w załączeniu.

0
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 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

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.

2

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

0

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....

0

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.

0
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

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