Hej! till att börja med kan du sluta leka med paranteser, din SQL sats var totalt oläslig. Hej Verifier! Lösningen fick jag hjälp av Christoffer med. Tusen tack.Knepigt sql-urval [LÖST]
Jag försöker lista 2 tabeller, Beställningslista där unik komb är Personnr och företag samt i Utförd där persnr är unik i komb med bokf_kod
komb personnr o företag i beställningslista skall kunna förekomma i beställningslista men finnas motsvarande matchning i utfört. I utfört finns personen men med annan bokf_kod.
Personen skall även kunna förekomma i utförd-fil men inte i beställningsfil i komb m persnr o bokf_kod.
Normalfallet är att beställningslista personnr företag är = med utfört personnr bokf_kod
Bifogar min sql-fråga.
SELECT Beställningslista.FÖRETAG, Beställningslista.Personnummer, Beställningslista.Namn, Beställningslista.Bruttoavdrag AS [Begärt avdrag], -[BELOPP] AS [Utfört avdrag], -[Begärt avdrag]+[utfört avdrag] AS Diff, UTFÖRT.ANSVAR, UTFÖRT.LART, UTFÖRT.PERIOD
FROM Beställningslista LEFT JOIN UTFÖRT ON (Beställningslista.Personnummer = UTFÖRT.PERSONNR) AND (Beställningslista.FÖRETAG = UTFÖRT.BOKF_KOD)
WHERE (((Beställningslista.FÖRETAG)=[UTFÖRT].[BOKF_KOD]) AND ((UTFÖRT.BOKF_KOD)=1) AND ((Beställningslista.Fombrutto)<=[UTFÖRT].[PERIOD]) AND ((Beställningslista.Tombrutto)>=[UTFÖRT].[PERIOD])) OR (((UTFÖRT.BOKF_KOD)=1) AND ((Beställningslista.Fombrutto)<=[Ange Period]) AND ((Beställningslista.Tombrutto)>=[Ange Period])) OR (((Beställningslista.FÖRETAG)<>[UTFÖRT].[BOKF_KOD]) AND ((UTFÖRT.BOKF_KOD)=1) AND ((Beställningslista.Fombrutto)<=[UTFÖRT].[PERIOD]) AND ((Beställningslista.Tombrutto)>=[UTFÖRT].[PERIOD]))
ORDER BY Beställningslista.Personnummer;
Tack på förhand
/Benke
Sv: Knepigt sql-urval
Sen får du referera till namnen i tabellen i dina beskrivningar.
SELECT b.FÖRETAG, b.Personnummer, b.Namn, b.Bruttoavdrag AS [Begärt avdrag], -[BELOPP] AS [Utfört avdrag], -[Begärt avdrag]+[utfört avdrag] AS Diff, u.ANSVAR, u.LART, u.PERIOD
FROM Beställningslista b
LEFT JOIN UTFÖRT u ON (b.Personnummer = u.PERSONNR) AND (b.FÖRETAG = u.BOKF_KOD)
WHERE
(
b.FÖRETAG = u.[BOKF_KOD]
AND u.BOKF_KOD = 1
AND b.Fombrutto <= u.[PERIOD]
AND b.Tombrutto >= u.[PERIOD]
)
OR
(
u.BOKF_KOD = 1
AND b.Fombrutto <= [Ange Period]
AND b.Tombrutto >= [Ange Period]
)
OR
(
b.FÖRETAG <> u.[BOKF_KOD]
AND u.BOKF_KOD = 1
AND b.Fombrutto <= u.[PERIOD]
AND b.Tombrutto >= u.[PERIOD]
)
ORDER BY b.Personnummer;
Vad är fel i SQL satsen och vad vill du åstakomma?Sv: Knepigt sql-urval
Ber om ursäkt att man är novis. Jag försökte att vara så tydlig som möjligt genom att i access hämta den sql-kod som finns i min urvalsfråga.
Hoppades att den enklare beskrev själva frågestrukturen med tabeller o namn. Jag skall försöka bättra mig.
Hur som, vad jag vill uppnå är följande:
Frågan tar fram ett resultat för 1 företag av 10
Detta resultat skall visa:
- samtliga b.personnummer med b.[begärt avdrag] och detta är mindre än,lika med eller större än u.personnr med u.[utfört avdrag]
- samtliga b.personnummer med b.[begärt avdrag] och det ej finns u.[utfört avdrag] för u.personnr
- samtliga b.personnummer som saknar b.[begärt avdrag] men där u.personnr har u.[utfört avdrag]
har försökt att göra detta i olika steg, men jag når aldrig längre än att jag lyckas med att få fram de första 2 svaren
Jag vet att det finns poster där u.personnr har värde i u.[utfört avdrag] men för b.personnummer saknas [begärt avdrag]
Hoppas att jag klarade att förtydliga frågan
/BenkeSv: Knepigt sql-urval
Visade sig att det var tvungen att köra en union-fråga, som blev rätt komplex. Finns säkert bättre sätt att skriva den på, men så här får jag den funktion jag vill ha.
*********************
SELECT
Beställningslista.personnummer
, Beställningslista.FÖRETAG
, Beställningslista.namn
, Beställningslista.erbjudande
, Beställningslista.bruttoavdrag as [Begärt avdrag]
, -[BELOPP] AS [Utfört avdrag]
, iif(-[Begärt avdrag]<>null,IIF([utfört avdrag]<>null,-[begärt avdrag]+[utfört avdrag],-[begärt avdrag]),+[utfört avdrag]) AS Diff
, Utfört.ansvar
, Utfört.lart
, UTFÖRT.personnr
, Utfört.period
, utfört.bokf_kod
FROM Beställningslista
INNER JOIN UTFÖRT ON Beställningslista.personnummer =
UTFÖRT.personnr
WHERE
(
(utfört.lart="3001" OR beställningslista.erbjudande=1)
AND
((Beställningslista.Fombrutto<=[Utfört].[Period] AND Beställningslista.Tombrutto>=[Utfört].[Period] OR [Utfört].[period]=[Ange Period])
OR
(Beställningslista.Fombrutto<=[Ange Period] AND Beställningslista.Tombrutto>=[Ange Period]
OR Utfört.period=[Ange period]))
AND
((Beställningslista.FÖRETAG=1 AND (UTFÖRT.BOKF_KOD=1 AND Utfört.ansvar='22300000'))
OR (Beställningslista.FÖRETAG=1 AND UTFÖRT.BOKF_KOD Is Null)
OR (Beställningslista.FÖRETAG Is Null AND (UTFÖRT.BOKF_KOD=1 AND Utfört.ansvar='22300000')))
)
ORDER BY Beställningslista.Personnummer
UNION
SELECT
Beställningslista.personnummer
, Beställningslista.FÖRETAG
, Beställningslista.namn
, Beställningslista.erbjudande
, Beställningslista.bruttoavdrag as [Begärt avdrag]
, -[BELOPP] AS [Utfört avdrag]
, iif(-[Begärt avdrag]<>null,IIF([utfört avdrag]<>null,-[begärt avdrag]+[utfört avdrag],-[begärt avdrag]),+[utfört avdrag]) AS Diff
, Utfört.ansvar
, Utfört.lart
, UTFÖRT.personnr
, Utfört.period
, utfört.bokf_kod
FROM Beställningslista
LEFT JOIN UTFÖRT ON Beställningslista.personnummer =
UTFÖRT.personnr
WHERE
(
(utfört.lart="3001" OR beställningslista.erbjudande=1)
AND
((Beställningslista.Fombrutto<=[Utfört].[Period] AND Beställningslista.Tombrutto>=[Utfört].[Period] OR [Utfört].[period]=[Ange Period])
OR
(Beställningslista.Fombrutto<=[Ange Period] AND Beställningslista.Tombrutto>=[Ange Period]
OR Utfört.period=[Ange period]))
AND
((Beställningslista.FÖRETAG=1 AND (UTFÖRT.BOKF_KOD=1 AND Utfört.ansvar='22300000'))
OR (Beställningslista.FÖRETAG=1 AND UTFÖRT.BOKF_KOD Is Null)
OR (Beställningslista.FÖRETAG Is Null AND (UTFÖRT.BOKF_KOD=1 AND Utfört.ansvar='22300000')))
)
ORDER BY Beställningslista.Personnummer
UNION SELECT
Beställningslista.personnummer
, Beställningslista.FÖRETAG
, Beställningslista.namn
, Beställningslista.erbjudande
, Beställningslista.bruttoavdrag as [Begärt avdrag]
, -[BELOPP] AS [Utfört avdrag]
, iif(-[Begärt avdrag]<>null,IIF([utfört avdrag]<>null,-[begärt avdrag]+[utfört avdrag],-[begärt avdrag]),+[utfört avdrag]) AS Diff
, Utfört.ansvar
, Utfört.lart
, UTFÖRT.personnr
, Utfört.period
, utfört.bokf_kod
FROM Beställningslista
RIGHT JOIN UTFÖRT ON Beställningslista.personnummer =
UTFÖRT.personnr
WHERE
(
(utfört.lart="3001" OR beställningslista.erbjudande=1)
AND
((Beställningslista.Fombrutto<=[Utfört].[Period] AND Beställningslista.Tombrutto>=[Utfört].[Period] OR [Utfört].[period]=[Ange Period])
OR
(Beställningslista.Fombrutto<=[Ange Period] AND Beställningslista.Tombrutto>=[Ange Period]
OR Utfört.period=[Ange period]))
AND
((Beställningslista.FÖRETAG=1 AND (UTFÖRT.BOKF_KOD=1 AND Utfört.ansvar='22300000'))
OR (Beställningslista.FÖRETAG=1 AND UTFÖRT.BOKF_KOD Is Null)
OR (Beställningslista.FÖRETAG Is Null AND (UTFÖRT.BOKF_KOD=1 AND Utfört.ansvar='22300000')))
)
ORDER BY Beställningslista.Personnummer;