Ga naar inhoud

[MS SQL 2000] Resultaten van 2 queries combineren


Aanbevolen berichten

Zo: ik heb ook eens een vraag ;) Ik ben bezig met een systeem dat simpelweg bestaat uit een aantal sensoren en een aantal metingen (die dus bestaat uit een sensorID en een waarde). Nu wil ik ontbrekende data detecteren, maar ik zie door de UNION's het bos niet meer... Situatie: een klant heeft een bepaald aantal sensoren, laat ik zeggen twee van type 1, één van type 2 en één van type 3. Nu komt er een meting binnen die bestaat uit 2 twee records: dat zijn er dus 2 te weinig (de klant heeft immers 4 sensoren). Het detecteren dat het er te weinig zijn is geen probleem, maar ik wil natuurlijk detecteren wélke sensoren er percies niet verwerkt zijn. Simpelweg bestaat mijn de setup tabel (afgezien van klantID's etc etc) uit de volgende waarden: 1,2,1,3 (2 sensoren type 1, 1 sensor type 2 en 1 sensor type 3) en de metingentabel (althans: de sensorID's) uit de waarden: 1,2 (om maar een voorbeeld te geven). Ik probeer dus nu een query te maken die teruggeeft dat ik bij die meting 1 maal een sensor van type 1 mis en 1 maal een sensor van type 3. Dat die type 3 er niet inzit lukt me nog wel, maar type 1 zit wel in de resultaten, maar slechts 1 maal. En daar zit dus het probleem: hoe dit te detecteren? Als ik een UNION gebruik komt er dus alleen die type 3 uit, type 1 is immers wel aanwezig... Wie helpt?
Link naar reactie
Ow jee: nu moet ik dus proberen phpBB wijs te maken hoe mijn tabellen eruit zien ;) Ik doe het overigens even erg simplistisch: er zijn wel wat meer kolommen aanwezig in de tabellen, maar die worden in dit geval toch niet gebruikt. customerSetup: [code:1:1a3c502403]customerID sensorID 1 1 1 2 1 1 1 3[/code:1:1a3c502403] data: [code:1:1a3c502403]customerID [time] sensorID measurement 1 x 2 10 1 x 1 5 [/code:1:1a3c502403]Ter verduidelijking: klant 1 heeft dus 4 sensoren (type 1 twee maal, type 2 één maal en type 3 ook eenmaal) en bij een meting op tijdstip "x" komen er maar 2 sensoren binnen: é6n van type 1 en één van type 2. Er ontbreekt dus é6n sensor van type 1 en é6n sensor van type 3.
Link naar reactie
[quote:6fbd5f10dc="Bill Gates"]Ow jee: nu moet ik dus proberen phpBB wijs te maken hoe mijn tabellen eruit zien ;) Ik doe het overigens even erg simplistisch: er zijn wel wat meer kolommen aanwezig in de tabellen, maar die worden in dit geval toch niet gebruikt. customerSetup: [code:1:6fbd5f10dc]customerID sensorID 1 1 1 2 1 1 1 3[/code:1:6fbd5f10dc] data: [code:1:6fbd5f10dc]customerID [time] sensorID measurement 1 x 2 10 1 x 1 5 [/code:1:6fbd5f10dc]Ter verduidelijking: klant 1 heeft dus 4 sensoren (type 1 twee maal, type 2 één maal en type 3 ook eenmaal) en bij een meting op tijdstip "x" komen er maar 2 sensoren binnen: é6n van type 1 en één van type 2. Er ontbreekt dus é6n sensor van type 1 en é6n sensor van type 3.[/quote:6fbd5f10dc] [code:1:6fbd5f10dc] SELECT DISTINCT d.customerId, d.myTime,cs.sensorId FROM data AS d LEFT JOIN customerSetup cs ON d.customerId=cs.customerId WHERE (d.sensorId <> cs.sensorId) ORDER BY d.CustomerId,d.myTime,cs.sensorId [/code:1:6fbd5f10dc]
Link naar reactie
[quote:7b5c9577c1="Bill Gates"]Dat werkt (helaas) niet. Ik krijg nu als resultaat:[code:1:7b5c9577c1]customerID [time] sensorID 1 x 1 1 x 2 1 x 3[/code:1:7b5c9577c1] Nog steeds niet goed dus :cry:[/quote:7b5c9577c1] Komt sensorId uit de customerSetup of de data tabel? Wat is [time] voor een veld en wat voor waarden staat daar in? Wat leveren onderstaande queries als resultaat op (om te testen)? [code:1:7b5c9577c1] SELECT d.*, cs.* FROM data d LEFT JOIN customerSetup cs ON d.customerId=cs.customerId [/code:1:7b5c9577c1] [code:1:7b5c9577c1] SELECT d.*, cs.* FROM data d LEFT JOIN customerSetup cs ON d.customerId=cs.customerId WHERE (d.sensorId <> cs.sensorId) [/code:1:7b5c9577c1]
Link naar reactie
[quote:4ad52f9805]Komt sensorId uit de customerSetup of de data tabel?[/quote:4ad52f9805]Het is eigenlijk gewoon een Foreign Key naar een andere tabel (die heel verassend "sensors" heet). Maar dat is niet zo interessant nu, alleen bij het toevoegen van records is dat van belang. [quote:4ad52f9805]Wat is [time] voor een veld en wat voor waarden staat daar in?[/quote:4ad52f9805]Dat is een "datetime" veld met de datum en tijd waarop de meting uitgevoerd is. [quote:4ad52f9805] Wat leveren onderstaande queries als resultaat op (om te testen)? [code:1:4ad52f9805] SELECT d.*, cs.* FROM data d LEFT JOIN customerSetup cs ON d.customerId=cs.customerId [/code:1:4ad52f9805] [/quote:4ad52f9805] [code:1:4ad52f9805] 1 2003-04-19 15:15:00.000 2 10 1 1 1 2003-04-19 15:15:00.000 2 10 1 2 1 2003-04-19 15:15:00.000 2 10 1 1 1 2003-04-19 15:15:00.000 2 10 1 3 1 2003-04-19 15:15:00.000 1 5 1 1 1 2003-04-19 15:15:00.000 1 5 1 2 1 2003-04-19 15:15:00.000 1 5 1 1 1 2003-04-19 15:15:00.000 1 5 1 3 [/code:1:4ad52f9805](customerID, [time], sensorID, measurement, customerID, sensorID) [quote:4ad52f9805] [code:1:4ad52f9805] SELECT d.*, cs.* FROM data d LEFT JOIN customerSetup cs ON d.customerId=cs.customerId WHERE (d.sensorId <> cs.sensorId) [/code:1:4ad52f9805][/quote:4ad52f9805][code:1:4ad52f9805]1 2003-04-19 15:15:00.000 2 10 1 1 1 2003-04-19 15:15:00.000 2 10 1 1 1 2003-04-19 15:15:00.000 2 10 1 3 1 2003-04-19 15:15:00.000 1 5 1 2 1 2003-04-19 15:15:00.000 1 5 1 3[/code:1:4ad52f9805](customerID, [time], sensorID, measurement, customerID, sensorID)
Link naar reactie
[quote:6e6cbfad1b="Bill Gates"][quote:6e6cbfad1b]Komt sensorId uit de customerSetup of de data tabel?[/quote:6e6cbfad1b]Het is eigenlijk gewoon een Foreign Key naar een andere tabel (die heel verassend "sensors" heet). Maar dat is niet zo interessant nu, alleen bij het toevoegen van records is dat van belang. [/quote:6e6cbfad1b] Ik bedoelde met sensorId het resultaat van de query. [quote:6e6cbfad1b="BillGates"] [quote:6e6cbfad1b] Wat leveren onderstaande queries als resultaat op (om te testen)? [code:1:6e6cbfad1b] SELECT d.*, cs.* FROM data d LEFT JOIN customerSetup cs ON d.customerId=cs.customerId [/code:1:6e6cbfad1b] [/quote:6e6cbfad1b] [code:1:6e6cbfad1b] 1 2003-04-19 15:15:00.000 2 10 1 1 1 2003-04-19 15:15:00.000 2 10 1 2 1 2003-04-19 15:15:00.000 2 10 1 1 1 2003-04-19 15:15:00.000 2 10 1 3 1 2003-04-19 15:15:00.000 1 5 1 1 1 2003-04-19 15:15:00.000 1 5 1 2 1 2003-04-19 15:15:00.000 1 5 1 1 1 2003-04-19 15:15:00.000 1 5 1 3 [/code:1:6e6cbfad1b](customerID, [time], sensorID, measurement, customerID, sensorID) [/quote:6e6cbfad1b] [code:1:6e6cbfad1b] SELECT DISTINCT d1.CustomerId, d1.[Time], cs.SensorId FROM data d1 LEFT JOIN customerSetup cs ON d1.CustomerId=cs.customerId WHERE cs.sensorId NOT IN ( SELECT d2.sensorId FROM data d2 WHERE d1.[Time]=d2.[Time] ) [/code:1:6e6cbfad1b] Zelf ff optimaliseren indien dat (eventueel) nog nodig mocht zijn... Waarom gebruik je trouwens [color=red:6e6cbfad1b]time[/color:6e6cbfad1b] als veldnaam?
Link naar reactie
[quote:e540e419ae="h4xX0r"][code:1:e540e419ae] SELECT DISTINCT d1.CustomerId, d1.[Time], cs.SensorId FROM data d1 LEFT JOIN customerSetup cs ON d1.CustomerId=cs.customerId WHERE cs.sensorId NOT IN ( SELECT d2.sensorId FROM data d2 WHERE d1.[Time]=d2.[Time] ) [/code:1:e540e419ae][/quote:e540e419ae]Dit is dus het probleem dat ik in het begin van de topic schetste, er komt nu dit uit:[code:1:e540e419ae]customerID [time] sensorID 1 2003-04-19 15:15:00.000 3[/code:1:e540e419ae]Nu mis ik dus dat er maar één sensor van type 1 aanwezig was en in de setup van die klant zijn er twee van type 1. En laat ik dat nou net willen detecteren ;) [quote:e540e419ae="h4xX0r"]Waarom gebruik je trouwens [color=red:e540e419ae]time[/color:e540e419ae] als veldnaam?[/quote:e540e419ae]Oude gewoonte ;)
Link naar reactie
[quote:e6829aea60="Bill Gates"]Dit is dus het probleem dat ik in het begin van de topic schetste, er komt nu dit uit:[code:1:e6829aea60]customerID [time] sensorID 1 2003-04-19 15:15:00.000 3[/code:1:e6829aea60]Nu mis ik dus dat er maar één sensor van type 1 aanwezig was en in de setup van die klant zijn er twee van type 1. En laat ik dat nou net willen detecteren ;)[/quote:e6829aea60] Zeg dat dan meteen. 8) [code:1:e6829aea60] SELECT DISTINCT d1.CustomerId, d1.[Time], cs.SensorId FROM data AS d1 LEFT JOIN customerSetup AS cs ON d1.CustomerId=cs.customerId WHERE cs.sensorId NOT IN ( SELECT d2.sensorId FROM data d2 WHERE (d1.[Time]=d2.[Time]) ) OR cs.sensorID IN ( SELECT d3.sensorId FROM data d3 GROUP BY d3.customerId,d3.[Time],d3.sensorId HAVING count(sensorId) <> ( SELECT count(*) FROM customerSetup cs2 WHERE (cs2.sensorId = d3.sensorId) AND (cs2.customerId = d3.customerId) ) AND (d1.customerId=d3.customerID) AND (d1.[Time]=d3.[Time]) ) [/code:1:e6829aea60] Dit kan vast efficiënter :) Er wordt in dit geval geen onderscheid gemaakt in de hoeveelheid ontbrekende data per type sensor.
Link naar reactie
  • 4 weken later...

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...