Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

[MS SQL 2000] Resultaten van 2 queries combineren

Tazzie
12 antwoorden
  • 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?
  • Bill, post even de structuur van de tabellen van waaruit je de gegevens wilt ophalen. In pricipe is het namelijk niet zo moeilijk, maar kan moeilijk even iets uit me hoofd doen zonder dat ik een datamodel voor me zie.

    Greetz,

    Taz
  • Gebruik overigens zo min mogelijk unions. Is vaak absoluut niet nodig…
  • 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.
  • [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]
  • Dat werkt (helaas) niet. Ik krijg nu als resultaat:[code:1:69aac08a2a]customerID [time] sensorID
    1 x 1
    1 x 2
    1 x 3[/code:1:69aac08a2a]

    Nog steeds niet goed dus :cry:
  • [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]
  • [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)
  • Wat maakt phpBB er toch een zooitje van :roll:
  • [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 time[/color:6e6cbfad1b] als veldnaam?
  • [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 time[/color:e540e419ae] als veldnaam?[/quote:e540e419ae]Oude gewoonte ;)
  • [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.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.