CompusaMedlem sedan jan. 20023 327 inlägg Hej! :)
Jag har följande tabeller:
Person: PersNr, Fnamn, Lnamn
Fireman: PersNr, ArbTimmar
Policeman: PersNr, ArbTimmar
PersNr i Fireman och Policeman är främmande nycklar till Person. Nu skulle jag vilja få fram följande, Namn och ArbTimmar på den Polis med mest arbetstimmar, samt samma för en brandman dvs:
Åke 700
Per 1000
Att hämta ut max-värdet på ArbTimmar i respektive tabell är inte svårt:
SELECT MAX(ArbTimmar) FROM Fireman
UNION
SELECT MAX(ArbTimmar) FROM Policeman
Problemet kommer när jag vill hämta namn på den person för respektive värde.. Har försökt med en inner join på följande vis, men då får jag ut alla namn på anställa samt antal arbtimmar.
SELECT Fname, MAX(ArbTimmar) FROM Fireman
INNER JOIN Person ON Fireman.PersNr = Person.PersNr
GROUP BY Fname
UNION
SELECT Fname, MAX(ArbTimmar) FROM Policeman
INNER JOIN Person ON Policeman.PersNr = Person.PersNr
GROUP BY Fname
Mycket tacksam för hjälp :)
Min första tanke var att sortera efter antalet timmar (ORDER BY ArbTimmar) och köra med LIMIT 1 istället. Kan det vara nåt tro?
LarsGMedlem sedan dec. 200012 464 inlägg SELECT 'Fireman', Fname, ArbTimmar
FROM Fireman
INNER JOIN Person ON Fireman.PersNr = Person.PersNr
where arbtimmar =
(select max(arbtimmar) from fireman)
UNION all
SELECT 'Policeman',Fname, ArbTimmar
FROM Policeman
INNER JOIN Person ON Policeman.PersNr = Person.PersNr
where arbtimmar =
(select max(arbtimmar) from policeman)
CompusaMedlem sedan jan. 20023 327 inlägg
TheMagnus skrev:
Min första tanke var att sortera efter antalet timmar (ORDER BY ArbTimmar) och köra med LIMIT 1 istället. Kan det vara nåt tro?
Tack för snabbt svar jo så har jag också gjort men då kan jag inte göra en union på det hela. Använder mig av firebird så syntaxen för detta ser lite annorlunda ut ;)
SELECT FIRST 1 Fname, ArbTimmar FROM Fireman
INNER JOIN Person ON Fireman.PersNr = Person.PersNr
ORDER BY ArbTimmar Desc
UNION
SELECT FIRST 1 Fname, ArbTimmar FROM Policeman
INNER JOIN Person ON Policeman.PersNr = Person.PersNr
ORDER BY ArbTimmar Desc
Jag tillåts dock inte göra union på detta, men SQL-frågorna fungerar som tänkt om jag kör dom var och en för sig. Problemet är dock att jag måste kunna slå ihop resultatet på nogåt sätt...
CompusaMedlem sedan jan. 20023 327 inlägg
LarsG skrev:
SELECT 'Fireman', Fname, ArbTimmar
FROM Fireman
INNER JOIN Person ON Fireman.PersNr = Person.PersNr
where arbtimmar =
(select max(arbtimmar) from fireman)
UNION all
SELECT 'Policeman',Fname, ArbTimmar
FROM Policeman
INNER JOIN Person ON Policeman.PersNr = Person.PersNr
where arbtimmar =
(select max(arbtimmar) from policeman)
Du är en klippa LarsG :)
Det fungerar, dock går det inte att namnge med 'Fireman', 'Policeman'. Känner du till något alternativt syntax eller vad man kan söka på för detta till Firebird? Visst inte att man kunde tilldela aggregat-funktioner på detta vis, men det är ju riktigt smidigt!
LarsGMedlem sedan dec. 200012 464 inlägg Namnge vad? Om du vill referera första värdet i resultatsetet med ett namn så får du ange ett sådant i select-satsen.
SELECT 'Fireman' as occupation, Fname, ArbTimmar
CompusaMedlem sedan jan. 20023 327 inlägg Jag menade första värdet i resultsetet. Perfekt LarsG, nu fungerar det precis så som jag vill ha det. Du räddade min fredag. Försökte googla men visste inte riktigt på vad. :)
/Edit
Varför måste antalet tecken vara lika långt för båda tabellerna i första värdet av Resultsetet? Får klagomål annars..