Springen naar inhoud


- - - - -
DB .NET

Sortering Kolommen

.NET

  • Log in a.u.b. om te beantwoorden
Er zijn 7 reacties in dit onderwerp

#1 Puffeltje

Puffeltje

    Senior Developer

  • Leden
  • PipPipPip
  • 125 berichten
    Laatst bezocht 08 jun 2019 21:50
  • LocatieBeverwijk

Geplaatst op 28 december 2013 - 00:27

Het gaat lekker met het aanleren van SQL.
Nu mijn volgende 'probleem': in mijn huidige query (welke heerlijk complex is geworden) krijg ik records met 3 kolommen retour, te weten "plaats1", "plaats2" en "afstand". Dit record kan bijvoorbeeld zijn:

"ALKMAAR  BEVERWIJK  25" maar kan net zo goed "BEVERWIJK  ALKMAAR  25" zijn. Dit is afhankelijk hoe de database is gevuld. Op deze vulling heb ik geen invloed.

De query wil ik gaan gebruiken in een subquery welke de eerste 2 kolommen sorteerd. "BEVERWIJK  ALKMAAR  25" moet dus omgezet worden naar "ALKMAAR  BEVERWIJK  25"

Wie kan mij een zetje in de juiste richting geven?

#2 tromt

tromt

    Professional Developer

  • Leden
  • PipPipPipPip
  • 303 berichten
    Laatst bezocht 17 apr 2018 10:02
  • LocatieRijen (NB)

Geplaatst op 30 december 2013 - 11:57

Je zou het jezelf ook makkelijker kunnen maken door er voor te zorgen dat de plaatsen goed worden opgeslagen, dus Alkmaar op plaats1 en Beverwijk op plaats2. Beetje afhankelijk van hoe de invoer gaat. Als er twee listboxen zijn waaruit ze een plaatsnaam kunnen kiezen dan kun je het opslaan zo regelen dat ze in alfabetische volgorde worden opgeslagen. Ben je van dat probleem af.

#3 josk79

josk79

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 614 berichten
    Laatst bezocht 16 aug 2018 17:25

Geplaatst op 30 december 2013 - 18:39

het is op te lossen met

Code:
SELECT CASE WHEN plaats1>plaats2 THEN plaats2 ELSE plaats1 END AS plaats1b FROM .....

...echter denk ik dat het handig is eerst je bestaande query te evalueren. Zou je hem willen plaatsen?

#4 Puffeltje

Puffeltje

    Senior Developer

  • Leden
  • PipPipPip
  • 125 berichten
    Laatst bezocht 08 jun 2019 21:50
  • LocatieBeverwijk

Geplaatst op 30 december 2013 - 19:47

@Ton,

Helaas heb ik geen invloed op de vulling van de database. Het gaat hier om een database van een standaard applicatie waar ik geen invloed op heb. Deze applicatie behelst de aderpaarregistratie van een telecommunicatienet bestaande uit koperkabels. De 'wegen' tussen de plaatsnamen (routes) zijn -helaas- richtingafhankelijk. De gebruiker kan een route invoeren van A naar B, of van B naar A. Tussen A en B kunnen meerdere lasmoffen aanwezig zijn. De route kan door de gebruiker opgebouwd worden vanuit de lasmoffen waardoor de uiteindelijke richting van de route bepaald word door de laatste mutatie.

@josk79
Ik zal straks vanaf mijn andere PC (waarop de query staat) de query posten. Ben alleen bang dat zonder de opbouw van de database er voor een buitenstaander niet echt uit te komen is. Omdat het een database is van een externe leverancier wil ik de complete database opbouw ook hier niet tonen; copyright en zo.
Je zal zien dat op het ogenblik mijn probleem is aangepakt met if-then-else constructies. Dit geeft bijna het gewenste resultaat. Het blijkt dat er nog dubbele identieke records voorkomen welke ik trachte met 'distinct' er uit te filteren maar dit lukt niet in combinatie met de if-then-else constructie. Ik was van plan om de query (zonder distinct) als een subquery op te nemen in de uiteindelijke query en hopelijk daarmee de dubbellingen er uit te krijgen.

#5 Puffeltje

Puffeltje

    Senior Developer

  • Leden
  • PipPipPip
  • 125 berichten
    Laatst bezocht 08 jun 2019 21:50
  • LocatieBeverwijk

Geplaatst op 31 december 2013 - 00:52

en hier de huidige query. Mijn if-then-else had ik blijkbaar al vervangen door een select-case-constructie.

Code:
/*
Deze query geeft alle routes van bepaalde verdeler naar alle mogelijke andere verdelers.
Een route welke begint of eindigd in een node met een categorie ongelijk aan 3 (verdeler)
wordt niet als geldig beschouwd en wordt uitgefilterd.
meerdere routes met dezelfde lengte, begin- en eindpunten worden maar eenmalig weergegeven
van routes met identieke eindpunten wordt alleen de kleinste lengte getoond
routes welke naar de opgevraagde node lopen zijn er uitgefilterd.
routes welke met een circuit zijn belegd zijn er uitgefilterd.
*/

select
--	 distinct
		 case
		 when (subquery1.knooppunt1<subquery1.knooppunt2) then subquery1.knooppunt1 else subquery1.knooppunt2
		 end as knp1
		 , case
		 when (subquery1.knooppunt1>subquery1.knooppunt2) then subquery1.knooppunt1 else subquery1.knooppunt2
		 end as kp2
	 
	 , min(subquery1.lengte) as lengte
from (
SELECT
		 distinct

		 decode(nw_seg.conn1_rev,1,node2.name,NODE1.NAME) as KNOOPPUNT1,
		 decode(nw_seg.conn2_rev,1,node3.name,NODE4.NAME) as KNOOPPUNT2,
		
		 nw_path.nwpname as circuit,
		 SUM (CABLE.LENGTH) as lengte
FROM TVNO.NW_SEG,
		 TVNO.CONNECTION,
		 TVNO.NODE NODE1,
		 TVNO.NODE NODE2,
		 TVNO.CONNECTION CONN2,
		 TVNO.NODE NODE3,
		 TVNO.NODE NODE4,
		 TVNO.NW_SEG_ELEM,
		 TVNO.CONNECTION CONNLENGTE,
		 TVNO.CABLE,
		 tvno.nw_path
WHERE	 (CONNECTION.ID = NW_SEG.CONN1)
		 AND (NODE1.ID = CONNECTION.NODE1)
		 AND (NODE2.ID = CONNECTION.NODE2)
		 AND (CONN2.ID = NW_SEG.CONN2)
		 AND (NODE3.ID = CONN2.NODE1)
		 AND (NODE4.ID = CONN2.NODE2)
		 AND (NW_SEG.ID = NW_SEG_ELEM.NW_SEG)
		 AND (CONNLENGTE.ID = NW_SEG_ELEM.CONN)
		 AND (CABLE.ID = CONNLENGTE.CABLE)
		 and (nw_seg.id = nw_path.nwseg1(+))
		 AND ( (NODE1.NAME = 'VP')
			 OR (NODE2.NAME = 'VP')
			 OR (NODE3.NAME = 'VP')
			 OR (NODE4.NAME = 'VP'))
		 and ( (decode(nw_seg.conn1_rev,1,node2.category,node1.category) = 3)
			 and (decode(nw_seg.conn2_rev,1,node3.category,node4.category) = 3))
		
		
		
GROUP BY NW_SEG.ID,
		 NW_SEG.CONN1,
		 NW_SEG.CONN1_REV,
		 NW_SEG.CONN2,
		 NW_SEG.CONN2_REV,
		 node1.category,
		 node2.category,
		 node3.category,
		 node4.category,
		 NODE1.NAME,
		 NODE2.NAME,
		 NODE3.NAME,
		 NODE4.NAME,
		 nw_path.nwpname

) subquery1
where (subquery1.circuit is null)
	 and (subquery1.lengte > 0)
	 and (subquery1.knooppunt1 is not null)
group by subquery1.knooppunt1
		 , subquery1.knooppunt2
order by subquery1.knooppunt1
		 , subquery1.knooppunt2



#6 Puffeltje

Puffeltje

    Senior Developer

  • Leden
  • PipPipPip
  • 125 berichten
    Laatst bezocht 08 jun 2019 21:50
  • LocatieBeverwijk

Geplaatst op 31 december 2013 - 12:16

En ik ben er uit. Hier volgt mij definiteive query. Een probleem was dat een route  'ALKMAAR  BEVERWIJK  25' goed getoond werd maar een route 'BEVERWIJK  ALKMAAR  24'  ook in de lijst getoond werd als 'ALKMAAR  BEVERWIJK  24'. Van deze 2 records had ik alleen de gene willen zien met de kleinste lengte. Dit heb ik opgelost door de resultaten nogmaals als een subquery op te nemen. Mogelijk dat ik dit ook op had kunnen lossen door 'order by' van subquery1 te voorzien van de case-constructie (als dat uberhaupt mogelijk is).Code:
/*
Deze query geeft alle routes van bepaalde verdeler naar alle mogelijke andere verdelers.
- Een route welke begint of eindigd in een node met een categorie ongelijk aan 3 (verdeler)
wordt niet als geldig beschouwd en wordt uitgefilterd. 
- meerdere routes met dezelfde lengte, begin- en eindpunten worden maar eenmalig weergegeven
- van routes met identieke eindpunten wordt alleen de kleinste lengte getoond
- routes welke naar de opgevraagde node lopen zijn er uitgefilterd.
- routes welke met een circuit zijn belegd zijn er uitgefilterd.
*/
select
		distinct
	   
		  subquery2.kp1
		, subquery2.kp2
		, min(subquery2.lengte) as afstand
	   
from (	   
-- start SUBQUERY2
		select   
				distinct
				  case
						when (subquery1.knooppunt1<subquery1.knooppunt2) then subquery1.knooppunt1 else subquery1.knooppunt2
				  end as kp1
				, case
						when (subquery1.knooppunt1>subquery1.knooppunt2) then subquery1.knooppunt1 else subquery1.knooppunt2
				  end as kp2
				, min(subquery1.lengte) as lengte
		from (
-- start SUBQUERY1
				  SELECT
						 distinct
						   decode(nw_seg.conn1_rev,1,node2.name,NODE1.NAME) as KNOOPPUNT1
						 , decode(nw_seg.conn2_rev,1,node3.name,NODE4.NAME) as KNOOPPUNT2
						 , nw_path.nwpname as circuit
						 , SUM (CABLE.LENGTH) as lengte
					FROM   TVNO.NW_SEG
						 , TVNO.CONNECTION
						 , TVNO.NODE NODE1
						 , TVNO.NODE NODE2
						 , TVNO.CONNECTION CONN2
						 , TVNO.NODE NODE3
						 , TVNO.NODE NODE4
						 , TVNO.NW_SEG_ELEM
						 , TVNO.CONNECTION CONNLENGTE
						 , TVNO.CABLE
						 , tvno.nw_path
				   WHERE	 (CONNECTION.ID = NW_SEG.CONN1)
						 AND (NODE1.ID = CONNECTION.NODE1)
						 AND (NODE2.ID = CONNECTION.NODE2)
						 AND (CONN2.ID = NW_SEG.CONN2)
						 AND (NODE3.ID = CONN2.NODE1)
						 AND (NODE4.ID = CONN2.NODE2)
						 AND (NW_SEG.ID = NW_SEG_ELEM.NW_SEG)
						 AND (CONNLENGTE.ID = NW_SEG_ELEM.CONN)
						 AND (CABLE.ID = CONNLENGTE.CABLE)
						 and (nw_seg.id = nw_path.nwseg1(+))
						 AND (   (NODE1.NAME = 'VP')
							  OR (NODE2.NAME = 'VP')
							  OR (NODE3.NAME = 'VP')
							  OR (NODE4.NAME = 'VP'))
						 and (	(decode(nw_seg.conn1_rev,1,node2.category,node1.category) = 3)
							  and (decode(nw_seg.conn2_rev,1,node3.category,node4.category) = 3))
						
				GROUP BY   NW_SEG.ID
						 , NW_SEG.CONN1
						 , NW_SEG.CONN1_REV
						 , NW_SEG.CONN2
						 , NW_SEG.CONN2_REV
						 , node1.category
						 , node2.category
						 , node3.category
						 , node4.category
						 , NODE1.NAME
						 , NODE2.NAME
						 , NODE3.NAME
						 , NODE4.NAME
						 , nw_path.nwpname
				) subquery1
		where   (subquery1.circuit is null)
				and (subquery1.lengte > 0)
				and (subquery1.knooppunt1 is not null)
				and (subquery1.knooppunt1 <> subquery1.knooppunt2)
		group by
				  subquery1.knooppunt1
				, subquery1.knooppunt2
		) subquery2
group by
		  subquery2.kp1
		, subquery2.kp2	   
	   
order by
		  subquery2.kp1
		, subquery2.kp2



#7 Jenny

Jenny

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 558 berichten
    Laatst bezocht 02 apr 2017 22:13

Geplaatst op 03 januari 2014 - 00:22

niet echt on topic, maar ik zet het toch maar hier,mischien kan het nuttig zijn

Bericht bekijkenPuffeltje, op 30 december 2013 - 19:47, zei:

De 'wegen' tussen de plaatsnamen (routes) zijn -helaas- richtingafhankelijk. De gebruiker kan een route invoeren van A naar B, of van B naar A. Tussen A en B kunnen meerdere lasmoffen aanwezig zijn. De route kan door de gebruiker opgebouwd worden vanuit de lasmoffen waardoor de uiteindelijke richting van de route bepaald word door de laatste mutatie.
en

Bericht bekijkenPuffeltje, op 31 december 2013 - 12:16, zei:

- Een route welke begint of eindigd in een node met een categorie ongelijk aan 3 (verdeler)
wordt niet als geldig beschouwd en wordt uitgefilterd.
- meerdere routes met dezelfde lengte, begin- en eindpunten worden maar eenmalig weergegeven
- van routes met identieke eindpunten wordt alleen de kleinste lengte getoond
- routes welke naar de opgevraagde node lopen zijn er uitgefilterd.
bovenstaande opmerkingen wekken bij mij de indruk dat bv:
'BEVERWIJK  ALKMAAR  24'
en
'ALKMAAR  BEVERWIJK  24'
Vectoren zijn,en geen Scalairen
bent u absoluut zeker dat de richting niets uitmaakt ?



#8 Puffeltje

Puffeltje

    Senior Developer

  • Leden
  • PipPipPip
  • 125 berichten
    Laatst bezocht 08 jun 2019 21:50
  • LocatieBeverwijk

Geplaatst op 03 januari 2014 - 13:15

Klopt, het zijn vectoren en de richting maakt niet uit.

Het netwerk wat ik door wil rekenen is een telecom koperkabel netwerk. De 'plaatsnamen' zijn de locaties waar de koperkabels bovengronds zijn afgewerkt op verdelers. De 'wegen' zijn de routes door de kabel heen. Doordat een kabel meerdere keren afgetakt kan zijn is het mogelijk dat ik tussen 2 'plaatsnamen' meerdere routes kan hebben met allemaal verschillende lengtes. Om mijn 'probleem' voor de forumleden begrijpelijk te houden heb ik alles voorgesteld als plaatsnamen met wegen er tussen. In onze database heeft Amsterdam ongeveer 2400 verdelers. De meeste forumleden kunnen zich moeilijk voorstellen wat een telecom koperkabel netwerk inhoudt maar kunnen zich wel plaatsnamen met wegen voorstellen.

De gebruiker wil alleen maar de kortste route weten tussen 2 verdelers, en welke verdelers hij hiervoor moet passeren. Voor de signalen welke over de route getransporteerd gaan worden is de richting van de route niet van belang. Helaas is de database zodanig opgebouwd dat deze wel een richting hanteerd voor de routes. Andere bedrijven die hetzelfde softwarepakket gebruiken houden wel rekening met deze richting. Ons bedrijf hecht geen waarde aan deze richting van de routes (en dit zit onze gebruikers ook vaak in de weg). Om mijn collega's te ontlasten schrijf ik diverse hulpapplicaties welke deze hobbeltjes in het softwarepakket aangenamer maken. Dit is goedkoper en sneller te realiseren dan een specifieke aanpassing door de fabrikant te laten maken.





Ook met taq DB .NET, .NET voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[DB .NET] Untitled 1

Met dank aan J├╝rgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)