Permalänk

Räkna nullvärden i SQL

Hejsan har stött på ett problem meningen är att man ska lista alla lärare som haft ett kurstillfälle under 2010 men även de som inte haft det ska visas och då med antal kurstillfällen 0,
Detta fungerar dock inte trots att jag definierat att nullvärden ska visas som just 0

SELECT DISTINCT pe.personnummer, namn, telefon, tjänsterum, Count (*) AS antal_kurstillf
FROM KURSTILLFÄLLE, PERSON PE, LÄRARE LR
WHERE startdatum
BETWEEN CDate('2010-01-01') AND CDate('2010-12-31')
AND pe.personnummer=lärare
AND kurstillfälle.lärare=lr.personnummer
GROUP BY pe.personnummer, namn, telefon, tjänsterum
UNION
SELECT pe.personnummer, namn, telefon, tjänsterum, 0
FROM KURSTILLFÄLLE, PERSON PE, LÄRARE LR

WHERE
pe.personnummer NOT IN (SELECT lärare FROM Kurstillfälle)
AND
startdatum
BETWEEN CDate('2010-01-01') AND CDate('2010-12-31')
AND
pe.personnummer=lärare
AND
pe.personnummer=lr.personnummer

Är det kanske enklare att använda sig av en Left outer join här?

Visa signatur

Amd xp 2700+ 1024mb dual ddr ram Radeon 9200 se ''

Permalänk
Medlem
Skrivet av '[-=WoS=-:

Toxic;13654877']Hejsan har stött på ett problem meningen är att man ska lista alla lärare som haft ett kurstillfälle under 2010 men även de som inte haft det ska visas och då med antal kurstillfällen 0,
Detta fungerar dock inte trots att jag definierat att nullvärden ska visas som just 0

SELECT DISTINCT pe.personnummer, namn, telefon, tjänsterum, Count (*) AS antal_kurstillf
FROM KURSTILLFÄLLE, PERSON PE, LÄRARE LR
WHERE startdatum
BETWEEN CDate('2010-01-01') AND CDate('2010-12-31')
AND pe.personnummer=lärare
AND kurstillfälle.lärare=lr.personnummer
GROUP BY pe.personnummer, namn, telefon, tjänsterum
UNION
SELECT pe.personnummer, namn, telefon, tjänsterum, 0
FROM KURSTILLFÄLLE, PERSON PE, LÄRARE LR

WHERE
pe.personnummer NOT IN (SELECT lärare FROM Kurstillfälle)
AND
startdatum
BETWEEN CDate('2010-01-01') AND CDate('2010-12-31')
AND
pe.personnummer=lärare
AND
pe.personnummer=lr.personnummer

Är det kanske enklare att använda sig av en Left outer join här?

Ja, det låter som att du borde kunna ställa en mindre tilltrasslad fråga (utan någon UNION) om du gör INNER JOIN mellan lärare och person och sedan LEFT JOIN mellan lärare och kurstillfälle.

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

Ja, så vitt jag vet kan man endast få de rader som saknas i ena tabellen med LEFT/RIGHT JOIN.

Permalänk

Okej tack , förstår dock inte hur upplägget ska vara rent syntaxmässigt , behöver joinsatserna nästlas på något vis?
att bara skriva

Person INNER JOIN Person ON (Person.personnummer=Lärare.personnummer)
Lärare LEFT OUTER JOIN Kurstillfälle ON (Lärare.personnummer=Kurstillfälle.lärare)

ger ju syntax error , det är Acesss 2010 som jag meckar med förövrigt.

Visa signatur

Amd xp 2700+ 1024mb dual ddr ram Radeon 9200 se ''

Permalänk
Medlem

Har ingen aning om hur Access fungerar, men bör inte din JOIN se ut så här?

Person INNER JOIN Lärare ON (Person.personnummer=Lärare.personnummer)
LEFT OUTER JOIN Kurstillfälle ON (Lärare.personnummer=Kurstillfälle.lärare)

Permalänk
Medlem

Rätt syntax är typ:

SELECT *
FROM Person p
INNER JOIN Lärare l ON (p.personnummer = l.personnummer)
LEFT OUTER JOIN Kurstillfälle k ON (l.personnummer = k.lärare)
WHERE p.personnummer = "xxxxxx-xxxx"
ORDER BY p.personnummer asc

Permalänk
Medlem
Skrivet av '[-=WoS=-:

Toxic;13655819']Okej tack , förstår dock inte hur upplägget ska vara rent syntaxmässigt , behöver joinsatserna nästlas på något vis?
att bara skriva

Person INNER JOIN Person ON (Person.personnummer=Lärare.personnummer)
Lärare LEFT OUTER JOIN Kurstillfälle ON (Lärare.personnummer=Kurstillfälle.lärare)

ger ju syntax error , det är Acesss 2010 som jag meckar med förövrigt.

google acces 2010 sql join
http://msdn.microsoft.com/en-us/library/office/ff197346.aspx

Verkar som att microsoft inte gillar parenteser av någon anledning. vad får du för felkod, får du någon?

(fundering: jag hade personligen inte gjort en tabell eller kolumn med med åäö i namnen)

EDIT: du kan få din union att funka, det är nog bättre med joins dock.

Visa signatur

"Det här systemet fungerar urkasst." - operatör.
"Hur ska det fungera då?" - jag
"Gör så att det fungerar som jag vill." - operatör.
/facepalm

Permalänk
Medlem

För drygt två år sedan postade Teknocide denna länk som förklarar hur man bör tänka för att undvika långa listor av GROUP BY-kolumner:
SQL GROUP BY techniques

Tack ännu en gång för den länken, Teknocide!

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av jovnas:

För drygt två år sedan postade Teknocide denna länk som förklarar hur man bör tänka för att undvika långa listor av GROUP BY-kolumner:
SQL GROUP BY techniques

Tack ännu en gång för den länken, Teknocide!

Det var så lite

Visa signatur

Kom-pa-TI-bilitet

Permalänk

SELECT Person.personnummer,namn,tjänsterum, COUNT (kurs) as antal
FROM
Kurstillfälle ,Person INNER JOIN Lärare ON (Person.personnummer=Lärare.personnummer)
LEFT OUTER JOIN Kurstillfälle k ON (l.personnummer = k.lärare)
WHERE
kurstillfälle.lärare=lärare.personnummer
AND
Lärare.personnummer NOT IN (SELECT lärare FROM Kurstillfälle)

AND
startdatum BETWEEN CDate('2010-01-01') AND CDate('2010-12-31')

GROUP BY
Person.personnummer , namn ,tjänsterum

"missing operator in Query expression" det går alltså inte att skriva ha två joins efter varandra i acess :p?

Visa signatur

Amd xp 2700+ 1024mb dual ddr ram Radeon 9200 se ''

Permalänk
Medlem
Citat:

In Access you need parentheses when you have more than one join:

FROM (drugs as a INNER JOIN warehouse as b ON a.ID = b.drug_id) INNER JOIN pharmacy as c ON b.drug_id = c.drug_id

Källa: http://stackoverflow.com/questions/10852499/access-2010-synta...

Visa signatur

as far as we can tell, the massacre went well...

Permalänk

Okej tack för hjälpen nu får jag rätt resultat i alla fall
har nu kommit fram till

SELECT DISTINCT L.personnummer ,namn,tjänsterum,telefon ,COUNT (startdatum) AS ANTAL
FROM (Person as P
INNER JOIN Lärare as L
ON P.personnummer = L.personnummer)
LEFT JOIN Kurstillfälle as K
ON L.personnummer = K.lärare
WHERE
L.personnummer NOT IN (SELECT lärare FROM Kurstillfälle)

GROUP BY
L.personnummer ,namn,tjänsterum,telefon

UNION

SELECT DISTINCT L.personnummer ,namn,tjänsterum,telefon ,COUNT (kurs) AS ANTAL
FROM (Person as P
INNER JOIN Lärare as L
ON P.personnummer = L.personnummer)
LEFT JOIN Kurstillfälle as K
ON L.personnummer = K.lärare

GROUP BY
L.personnummer ,namn,tjänsterum,telefon

Nu stämmer ju antalet kurser som varje lärare har haft och de som inte haft några visas med 0,
men hur lägger man smidigast in ett datumvillkor? BETWEEN varianten verkar ge fel resultat..

Visa signatur

Amd xp 2700+ 1024mb dual ddr ram Radeon 9200 se ''