[SQL] 1 Tabel, meerdere resultaten optellen.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 16:26

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
Hey mensen, ik ben bezig met een SQL statment en ik kom er even helemaal niet uit.
Heb al gegoogled op mogelijkheden om mn statement klaar te maken, maar ik kom steeds uit op oplossingen die voor mij niet werken, JOIN/Inner Join, subquery's. Ik ben eventjes kwijt hoe ik het moet doen.

Probleem:
Ik heb een tabel met daarin meetwaarden, tellingen ed.
Deze worden allemaal bij elkaar opgeslagen door ongeveer dit:
"Tagname" | "TimeStamp" | "Value"

Nu ben ik bezig om een telling op te halen. Ik wil tussen 2 tijden weten hoeveel deze telling is veranderd.
Dit werkt verder wel:

code:
1
2
3
SELECT  MAX(ihR.Value) - MIN(ihRawData.Value) as "TagValue"
FROM  ihR
WHERE  (ihR.TimeStamp >= {StartDateTime?}) AND (ihR.TimeStamp <= {EndDateTime?}) AND  (ihRawData.Tagname = {Tagname?}  )


Nu ben ik opzoek naar een manier om 4 verschillende van deze resultaten op te tellen.
Dus 4 keer deze query uitvoeren voor bijvoorbeeld:
Tagname = "Tagname1" / "Tagname2" / "Tagname3" / "Tagname4"
En deze optellen, maar ik krijg het niet voor elkaar.
Voornamelijk omdat het uit dezelfde tabel komt en de kolomnamen dus elke keer hetzelfde zijn.
Wie kan mij hier mee opweg helpen?

Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Nu online
Eigenlijk wil je dus het aantal (count) unieke (distinct) Tagnames tussen (between, maar met >= and <= mag ook) twee datums/tijden hebben? Zo ja, dan speel eens wat met de hints die al in de zin staan :P

Edit:
Sorry, niet goed gelezen, hoeveel, hoevaak... 8)7

[ Voor 12% gewijzigd door RobertMe op 24-02-2010 13:09 ]


Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
code:
1
2
3
4
5
SELECT  MAX(ihR.Value) - MIN(ihRawData.Value) as "TagValue"
FROM  ihR
WHERE ihR.TimeStamp
BETWEEN value1 AND value2
AND ( ihRawData.Tagname = value1 OR ihRawData.Tagname value2 )


Volgens mij is dit wat je bedoeld met dat je meerdere tagnames doorwilt :? Anders kun je ihRawData.Tagname IN (value1,value2) proberen, maar zal denk ik zelfde resultaat opleveren.

Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 16:26

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
RobertMe schreef op woensdag 24 februari 2010 @ 12:34:
Eigenlijk wil je dus het aantal (count) unieke (distinct) Tagnames tussen (between, maar met >= and <= mag ook) twee datums/tijden hebben? Zo ja, dan speel eens wat met de hints die al in de zin staan :P
Nee dat gaat helaas niet op, ik zal de lijst uitleggen:

"Tagname1" 12561156 0:0:0
"Tagname2" 32165418 0:0:0

"Tagname1" 12561157 0:0:1
"Tagname2" 32165419 0:0:1

"Tagname1" 12561158 0:0:2
"Tagname2" 32165420 0:0:2

"Tagname1" 12561159 0:0:3
"Tagname2" 32165421 0:0:3

Stel ik wil nu vanaf moment 1 t/m moment 3 het verschil weten tussen die momenten.
Dus:
Tagname1 => 12561159 - 12561157 = 2
Tagname2 => 32165419 - 32165421 = 2

En deze dan optellen. Dus Distinct gaat niet op, want ze zijn per tagname sowiso altijd uniek (endless counters).
En Count kan wel maar dan moet ik eerst nog de 4 tags appart zien op te halen. En dat is ook wat er misgaat. Count snap ik wel :P
Maar hoe fix ik die 4 tagwaarden?
4Real schreef op woensdag 24 februari 2010 @ 13:01:
code:
1
2
3
4
5
SELECT  MAX(ihR.Value) - MIN(ihRawData.Value) as "TagValue"
FROM  ihR
WHERE ihR.TimeStamp
BETWEEN value1 AND value2
AND ( ihRawData.Tagname = value1 OR ihRawData.Tagname value2 )


Volgens mij is dit wat je bedoeld met dat je meerdere tagnames doorwilt :? Anders kun je ihRawData.Tagname IN (value1,value2) proberen, maar zal denk ik zelfde resultaat opleveren.
Jah maar dan gaat de Min/Max functie niet meer werken :P

[ Voor 20% gewijzigd door Armageddon_2k op 24-02-2010 13:07 ]


Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Nu online
Sorry, ik had inderdaad niet goed gelezen (hoeveel => hoevaak) 8)7

Wil je alleen het totale verschil of wil je ook het verschil per groep/tagname hebben?

En over welk merk database hebben we het?

Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 16:26

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
RobertMe schreef op woensdag 24 februari 2010 @ 13:12:
Sorry, ik had inderdaad niet goed gelezen (hoeveel => hoevaak) 8)7

Wil je alleen het totale verschil of wil je ook het verschil per groep/tagname hebben?

En over welk merk database hebben we het?
Haha :)
Laten we stellen: het gaat om 4 productielijnen die ieder een eigen product telling hebben.
Deze kunnen dus alle 4 sterk varieren, omdat bv een lijn is een tijd niet actief is. De telling van de producten loopt eindeloos door. Dus de telling wordt nooit ge-reset.
Nu wil ik weten hoeveel er een specifieke dag is geproduceerd.
Het statement dat ik in de FP geef werkt voor 1 productielijn.
Ik geef dan de starttijd van die dag en de eindtijd, en dan krijg ik de productietelling.
Maar het is dus ook nodig om de totale productietelling te kunnen zien. Dus deze resultaten bij elkaar opgeteld.

Het gaat om een Microsoft SQL Server.

Acties:
  • 0 Henk 'm!

  • page404
  • Registratie: November 2009
  • Laatst online: 11:53

page404

Website says no

Oracle database? gewoon elke query als subquery in de select opnemen.
code:
1
2
3
4
5
6
7
8
9
select
( SELECT  MAX(ihR.Value) - MIN(ihRawData.Value) as "TagValue"
   FROM  ihR
   WHERE  (ihR.TimeStamp >= {StartDateTime?}) AND (ihR.TimeStamp <= {EndDateTime?}) AND   (ihRawData.Tagname = {Tagname?}  ) ) val1 +
(SELECT  MAX(ihR.Value) - MIN(ihRawData.Value) as "TagValue"
FROM  ihR
WHERE  (ihR.TimeStamp >= {StartDateTime?}) AND (ihR.TimeStamp <= {EndDateTime?}) AND  (ihRawData.Tagname = {Tagname?}  )) val2 +
[... nog 2x ...]
from dual;

ZIPper: Zelfstandig Interim Professional


Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
Armageddon_2k schreef op woensdag 24 februari 2010 @ 13:06:
[...]


[...]

Jah maar dan gaat de Min/Max functie niet meer werken :P
Ik heb je tabellen structuur even snel nagemaakt en krijg met de volgende query een werkend resultaat, en hopelijk wat jij wilt :P

code:
1
2
3
4
5
6
7
8
9
10
SELECT ihRawData.tagname, MAX( ihR.Value ) - MIN( ihRawData.Value ) AS "TagValue"
FROM ihR, ihRawData
WHERE ihR.TimeStamp
BETWEEN 1
AND 2
AND (
ihRawData.Tagname = 'tagname1'
OR ihRawData.Tagname = 'tagname2'
)
GROUP BY ihRawData.Tagname

Je krijgt nu per tagname het verschil tussen de hoogste en laagste waarde die er is.

edit:
Na lezen dat je mssql db hebt lijkt me wel handig om te vermelden dat ik het op een mysql db heb getest.

[ Voor 7% gewijzigd door 4Real op 24-02-2010 13:21 ]


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 16:26

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
page404 schreef op woensdag 24 februari 2010 @ 13:19:
Oracle database? gewoon elke query als subquery in de select opnemen.
code:
1
2
3
4
5
6
7
8
9
select
( SELECT  MAX(ihR.Value) - MIN(ihRawData.Value) as "TagValue"
   FROM  ihR
   WHERE  (ihR.TimeStamp >= {StartDateTime?}) AND (ihR.TimeStamp <= {EndDateTime?}) AND   (ihRawData.Tagname = {Tagname?}  ) ) val1 +
(SELECT  MAX(ihR.Value) - MIN(ihRawData.Value) as "TagValue"
FROM  ihR
WHERE  (ihR.TimeStamp >= {StartDateTime?}) AND (ihR.TimeStamp <= {EndDateTime?}) AND  (ihRawData.Tagname = {Tagname?}  )) val2 +
[... nog 2x ...]
from dual;
Even geprobeerd, ik krijg dan een "Column does not exist fout" :(
4Real schreef op woensdag 24 februari 2010 @ 13:19:
[...]
Je krijgt nu per tagname het verschil tussen de hoogste en laagste waarde die er is.
Even getest, werkt in principe wel, die group by zorgt er idd voor dat hij niet de MIN en MAX van het hele zooite krijgt. Maar, daar was ik al :P
Dus dan daar de sum van de MIN en de MAX van de verschillende tags ;)

[ Voor 22% gewijzigd door Armageddon_2k op 24-02-2010 13:39 ]


Acties:
  • 0 Henk 'm!

  • page404
  • Registratie: November 2009
  • Laatst online: 11:53

page404

Website says no

RobertMe schreef op woensdag 24 februari 2010 @ 13:12:

En over welk merk database hebben we het?
ah, SQL server. Ja, ik weet niet hoe die met subqueries en andere uitdagingen omgaat.

[ Voor 13% gewijzigd door page404 op 24-02-2010 14:02 ]

ZIPper: Zelfstandig Interim Professional


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 16:26

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
Okay, het blijkt een beperkte variant van SQL te zijn die niet overweg kan met SubQuery's Joins of Unions.
Heb het aan de "Client"-Side opgelost.
iig bedankt voor de hulp

Acties:
  • 0 Henk 'm!

  • HeSitated
  • Registratie: April 2009
  • Laatst online: 03-12-2024
Armageddon_2k schreef op woensdag 24 februari 2010 @ 16:18:
het blijkt een beperkte variant van SQL te zijn die niet overweg kan met SubQuery's Joins of Unions.
Nou maak je me nieuwsgierig.... :)

Doe eens:
SQL:
1
SELECT @@VERSION

Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 16:26

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
HeSitated schreef op woensdag 24 februari 2010 @ 16:22:
[...]
Nou maak je me nieuwsgierig.... :)
Doe eens:
SQL:
1
SELECT @@VERSION
Even over dat beperkt hea :+ :

Query error
Command was not set for the command object

Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 14:42

The Eagle

I wear my sunglasses at night

Voor het nageslacht dan maar: Kijk ook eens naar de UNION operator. Dan krijg je de resultaten van de losse queries mooi onder elkaar :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 16:26

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
The Eagle schreef op woensdag 24 februari 2010 @ 16:47:
Voor het nageslacht dan maar: Kijk ook eens naar de UNION operator. Dan krijg je de resultaten van de losse queries mooi onder elkaar :)
En voor de mensen die de rest van de posts wel hebben gelezen dan maar: Dat lukte ook wel, het ging hem om de optelling. :P
Pagina: 1