[MS-SQL2000] Database results samenvoegen tot 1 row*

Pagina: 1
Acties:

Onderwerpen


  • Scheffer
  • Registratie: Maart 2008
  • Laatst online: 07-12-2021
Hallo,

Ik zoek een formule waarmee ik meerdere variabele kan samenvoegen.

Bijvoorbeeld bij SELECT Naam from tbl_Naam where Achternaam = 'Tweakers'
en de uitkomst hiervan is 3 rijen, namelijk:
Jan
Sjaak
Piet

Deze moeten samengevoegd worden in 1 variabele zodat dit de uitkomst is: Jan,Sjaak,Piet

Kan iemand mij hier mee helpen? Ik heb het al geprobeerd met 'Cursor Fast_Forward' maar ik krijg het maar niet voor elkaar.

Als je nog meer info nodig hebt laat het even weten, alvast bedankt!

Greetz,
Scheffer

Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Welke SQL server gebruik je?

[ Voor 180% gewijzigd door BtM909 op 18-09-2008 15:43 ]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • Scheffer
  • Registratie: Maart 2008
  • Laatst online: 07-12-2021
Sorry er vergeten bij te melden.

Ik gebruik SQL Server 2000

Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Overigens mis ik ook een beetje wat je zelf hebt geprobeerd. Zoals je kan lezen in Welkom in Programming - FAQ en Beleid, zijn er een aantal dingen die je zelf kan c.q. moet proberen voordat je een topic opent.

Als ik overigens ga [google=MS-SQL show result in (1 or single) row], dan krijg ik al een hoop relevante resultaten (welke in dit geval specifiek voor MS-SQL zijn).

Geef met name in je topicstart aan waar je op hebt gezocht, wat je hebt gevonden en waarom de geboden oplossingen geen resultaat boden.

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • remco_k
  • Registratie: April 2002
  • Laatst online: 19:06

remco_k

een cassettebandje was genoeg

Van SQL server 2000 weet ik het niet, maar sommige servers hebben een list() functie.
Zoek die eens op.

Alles kan stuk.


  • Tubby
  • Registratie: Juni 2001
  • Laatst online: 15:26

Tubby

or not to be

Jammer, onder MySQL kun je dat met GROUP_CONCAT doen.

Onder Microsoft SQL Server gaat het niet zo handig, heb het laatst wel laten maken maar het resulteerde in een view die zoiezo niet oneindig schaalbaar is in rijen (met een hard aantal erin).

tubby.nl - Artes Moriendi - q1 - bf1942 - WoT - pubg - LinkedIN


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
SQL is een taal om data te manipuleren, op te halen, te bewerken, etc .... Het is niet de taak van SQL om de presentatie van die gegevens te verzorgen.
Maw: je moet SQL niet gebruiken om dit te verwezenlijken, maar doe dit in je 'client' code. (C#, Delphi, VB, whatever).

Wil je het toch doen, dan kan je best een UDF (user defined function) maken die dit voor jou doet.

https://fgheysels.github.io/


  • Scheffer
  • Registratie: Maart 2008
  • Laatst online: 07-12-2021
Ik heb het commando TOP gevonden voor SQL. En dan de COUNT gebruiken en met IF in VB.NET het specificeren.

Oftewel als COUNT = 1 dan SELECT TOP 1 * FROM enz, en als COUNT = 2 dan SELECT TOP 2 * FROM enz. Het hoogst haalbare is 4 dus dat is nog wel te toen, krijg je misschien wel een grote code, maarja zolang het maar snel en werkbaar is :)

Iedereen bedankt voor alle antwoorden!!!!

@BtM909: Ik zal in het vervolg wat meer opschrijven, met alles wat ik zelf geprobeerd heb.

Greetz,
Scheffer

Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
Eh, beats me maar wat heeft 'TOP' te maken met het probleem uit je topicstart ? Met TOP beperk je gewoon het aantal rijen in je resultset

https://fgheysels.github.io/


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Met de functie COALESCE en een user defined function kom je een eind denk ik...

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • Scheffer
  • Registratie: Maart 2008
  • Laatst online: 07-12-2021
whoami schreef op donderdag 18 september 2008 @ 16:26:
Eh, beats me maar wat heeft 'TOP' te maken met het probleem uit je topicstart ? Met TOP beperk je gewoon het aantal rijen in je resultset
Met TOP kan ik een bepaalde rij pakken, als de count 3 is en ik wil de 3e hebben dan kan ik de eerste uitsluiten door er later bij te vertellen dat ik TOP2 niet hoef te hebben.

Dus TOP, dan TOP (TOP1, sluit de eerste uit) en dan TOP (TOP, sluit de eerste 2 uit) en dan kan ik ze gewoon samenvoegen met VB.NET en dan heb ik zoals ik wou een samengevoegde variabele.

[ Voor 18% gewijzigd door Scheffer op 18-09-2008 16:50 ]

Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 17:37

TeeDee

CQB 241

Beetje overkill imo.

C#:
1
2
3
4
5
6
string meuk="";
//db meuk
while(datareader.Read())
{
   meuk=meuk + datareader["naam"].tostring();
}

Lijkt me logischer dan ~3 keer een query met TOP uit te voeren.
Ik weet het niet zeker, maar het kan dat een TOP een full-table-scan uitvoert, en dat wil je eigenlijk ook weer niet voor zoiets triviaals als dit.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

In theorie zou je't met een cursor kunnen oplossen, maar ik denk dat je best whoami's raad opvolgt en je applicatie voor de concatenatie laat zorgen.

  • Scheffer
  • Registratie: Maart 2008
  • Laatst online: 07-12-2021
TeeDee schreef op donderdag 18 september 2008 @ 16:54:
Beetje overkill imo.

C#:
1
2
3
4
5
6
string meuk="";
//db meuk
while(datareader.Read())
{
   meuk=meuk + datareader["naam"].tostring();
}

Lijkt me logischer dan ~3 keer een query met TOP uit te voeren.
Ik weet het niet zeker, maar het kan dat een TOP een full-table-scan uitvoert, en dat wil je eigenlijk ook weer niet voor zoiets triviaals als dit.
Ik zal er eens naar kijken, maar de TOP functie gaat niet de hele tabel door, je kunt gewoon bijvoorbeeld WHERE Achternaam = 'Tweakers' meegeven

Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
Scheffer schreef op donderdag 18 september 2008 @ 17:04:
[...]


Ik zal er eens naar kijken, maar de TOP functie gaat niet de hele tabel door, je kunt gewoon bijvoorbeeld WHERE Achternaam = 'Tweakers' meegeven
Dat wil nog niets zeggen hé.
Als je een SELECT TOP ... ORDER BY doet, dan zal SQL Server toch eerst de gehele resultset ophalen, deze sorteren, en dan pas de TOP toepassen.

https://fgheysels.github.io/


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Scheffer schreef op donderdag 18 september 2008 @ 17:04:
[...]


Ik zal er eens naar kijken, maar de TOP functie gaat niet de hele tabel door, je kunt gewoon bijvoorbeeld WHERE Achternaam = 'Tweakers' meegeven
8)7
Seriously: neem eens een tutorial SQL/Programmeren. Wat ik er van begrijp (en dat is nogal vaag nu) is dat je alle personen op wil halen met de naam 'janssen' en dan (bijv) de voornamen aan elkaar plakken?

Dan doe je dus in SQL: select voornaam from personen where achternaam = 'janssen'
En daarna loop je in je code door die dataset heen en concat je de namen aan elkaar. Niks geen top's, niks geen 'door de hele tabel heen lopen'. Precies wat whoami zegt, en ook de enige juiste oplossing imho. Ja, er zijn ranzige geintjes uit te halen met udf's en (onder MySQL bijv. Group_Concat) maar dat soort zaken wil je helemaal niet door je DBMS laten afhandelen.

Hoe je bij zaken als 'Cursor Fast_Forward' en 'TOP' terecht komt, die werkelijk niets met het eigenlijke probleem te maken hebben, is mij een raadsel en wijst er gewoon op dat je de basiskennis nog ontbeert. Dat is niet om je af te vlammen of voor je schenen te schoppen maar gewoon een teken dat je je er wat meer in moet verdiepen en er wat meer van moet leren; dat hebben wij ook allemaal ooit moeten doen ;)

[ Voor 31% gewijzigd door RobIII op 18-09-2008 17:12 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Scheffer
  • Registratie: Maart 2008
  • Laatst online: 07-12-2021
whoami schreef op donderdag 18 september 2008 @ 17:06:
[...]

Dat wil nog niets zeggen hé.
Als je een SELECT TOP ... ORDER BY doet, dan zal SQL Server toch eerst de gehele resultset ophalen, deze sorteren, en dan pas de TOP toepassen.
Blijkt maar weer hoe weinig verstand ik van SQL heb :P

Oftewel ik moet gewoon de data ophalen met bijvoorbeeld: SELECT Naam FROM tbl_Naam WHERE Achternaam = 'Tweakers' en daarna deze in VB.Net bewerken...kom ik weer meteen aan het begin van me vraag uit, hoe krijg ik dit in 1 variabele...:S

Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Scheffer schreef op donderdag 18 september 2008 @ 17:12:
Blijkt maar weer hoe weinig verstand ik van SQL heb :P
Zoals ik dus reeds vaststelde :P
Scheffer schreef op donderdag 18 september 2008 @ 17:12:
hoe krijg ik dit in 1 variabele...:S
En vandaar dat ik ook "tutorial programmeren" erbij noemde; dit is écht basiskennis. Door je resultsetje heen itereren en met een stringbuilder de waardes aan elkaar plakken is écht geen rocket science ;)
TeeDee's post geeft al een goed begin; hoewel ik zelf een stringbuilder zou gebruiken, maar dat zijn details.

Again; het is helemaal niet erg als je ergens (nog) niet in thuis bent of geen kaas van hebt gegeten, maar dit zijn gewoon echt basis dingetjes en we verwachten hier dat je toch wel enigszins de basis onder de knie hebt voor je een topic opent ;)

[ Voor 32% gewijzigd door RobIII op 18-09-2008 17:16 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 17:37

TeeDee

CQB 241

Scheffer schreef op donderdag 18 september 2008 @ 17:12:
[...]
daarna deze in VB.Net bewerken...kom ik weer meteen aan het begin van me vraag uit, hoe krijg ik dit in 1 variabele...:S
En het is nog niet in je opgekomen om mijn code even te bekijken? Weliswaar in C# maar is dusdanig makkelijk dat je dat in een zucht en een scheet in VB.net hebt.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • MeatLoaf
  • Registratie: Januari 2003
  • Laatst online: 06-04 20:06
4of9 schreef op donderdag 18 september 2008 @ 16:41:
Met de functie COALESCE en een user defined function kom je een eind denk ik...
Dit kun je inderdaad doen met de functie COALESCE

SQL:
1
2
3
SELECT @sHulp = COALESCE(@sHulp + ', ','') + Rtrim(Naam)
FROM   tbl_Naam
WHERE  Achternaam                   =  'Tweakers'

  • Scheffer
  • Registratie: Maart 2008
  • Laatst online: 07-12-2021
RobIII schreef op donderdag 18 september 2008 @ 17:08:
[...]

8)7
Seriously: neem eens een tutorial SQL/Programmeren. Wat ik er van begrijp (en dat is nogal vaag nu) is dat je alle personen op wil halen met de naam 'janssen' en dan (bijv) de voornamen aan elkaar plakken?

Dan doe je dus in SQL: select voornaam from personen where achternaam = 'janssen'
En daarna loop je in je code door die dataset heen en concat je de namen aan elkaar. Niks geen top's, niks geen 'door de hele tabel heen lopen'. Precies wat whoami zegt, en ook de enige juiste oplossing imho. Ja, er zijn ranzige geintjes uit te halen met udf's en (onder MySQL bijv. Group_Concat) maar dat soort zaken wil je helemaal niet door je DBMS laten afhandelen.

Hoe je bij zaken als 'Cursor Fast_Forward' en 'TOP' terecht komt, die werkelijk niets met het eigenlijke probleem te maken hebben, is mij een raadsel en wijst er gewoon op dat je de basiskennis nog ontbeert. Dat is niet om je af te vlammen of voor je schenen te schoppen maar gewoon een teken dat je je er wat meer in moet verdiepen en er wat meer van moet leren; dat hebben wij ook allemaal ooit moeten doen ;)
De namen was bedoeld als voorbeeld, in werkelijkheid komt het er op neer dat we hier een tabel hebben met alle geplande monteurs, in die tabel staat de ID,MonteurID,OrderID. ID is de ID van de eigen tabel, MonteurID is de ID van de tabel tbl_Monteurs en de OrderID is van de tabel tbl_Orderverwerking.

Vanuit die tabel wil ik weten wie er heeft gewerkt aan een bepaalde order en omdat het alleen ter info is wil ik de namen graag samengevoegd hebben tot 1 variabele, deze zal hooguit 3 tot 5 namen bevatten, meer monteurs zullen er niet op een order zitten.

Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Scheffer schreef op donderdag 18 september 2008 @ 17:17:
De namen was bedoeld als voorbeeld, in werkelijkheid komt het er op neer dat we hier een tabel hebben met alle geplande monteurs, in die tabel staat de ID,MonteurID,OrderID. ID is de ID van de eigen tabel, MonteurID is de ID van de tabel tbl_Monteurs en de OrderID is van de tabel tbl_Orderverwerking.
Dat maakt toch geen verschil? Dat verandert niets aan wat je hier verteld wordt.
Scheffer schreef op donderdag 18 september 2008 @ 17:17:
Vanuit die tabel wil ik weten wie er heeft gewerkt aan een bepaalde order en omdat het alleen ter info is wil ik de namen graag samengevoegd hebben tot 1 variabele, deze zal hooguit 3 tot 5 namen bevatten, meer monteurs zullen er niet op een order zitten.
En again; ik zie het verschil niet? En waarom dat dat gedoe met die TOP's zou rechtvaardigen is me net zo'n raadsel.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Scheffer
  • Registratie: Maart 2008
  • Laatst online: 07-12-2021
Dan ga ik de tutorials maar eens ff doorspitten :)

In ieder geval bedankt voor alle antwoorden en ik ga meteen eens even klieren met het antwoord van Meatlove en TeeDee.

Mocht ik iemand agressief hebben gemaakt met mijn vragen dan zou ik maar een stukje gaan rennen :p

Nogmaals bedankt voor alle info en mijn excuses voor de overlast.

Greetz,
Scheffer

Waar de grenzen liggen van de mogelijkheden? Op het punt waar je fantasie ophoudt!


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
MeatLoaf schreef op donderdag 18 september 2008 @ 17:16:
[...]


Dit kun je inderdaad doen met de functie COALESCE

SQL:
1
2
3
SELECT @sHulp = COALESCE(@sHulp + ', ','') + Rtrim(Naam)
FROM   tbl_Naam
WHERE  Achternaam                   =  'Tweakers'
Nee, dat kan je niet want COALESCE werkt op column niveau, en niet op set niveau.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • dvvelzen
  • Registratie: Februari 2002
  • Laatst online: 07-08 19:20
aangezien ms sql in een ver verleden van sybase is afgeleid. Probeer het volgende trukje eens

code:
1
2
3
4
5
declare @x varchar(2000)

update <table>
set @x = name + " " + @x
where <condition>


misschien werkt het op ms sql nog steeds :)

[ Voor 5% gewijzigd door dvvelzen op 19-09-2008 06:22 ]


Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
whoami schreef op donderdag 18 september 2008 @ 18:51:
[...]
Nee, dat kan je niet want COALESCE werkt op column niveau, en niet op set niveau.
Dat kan wel.

De TS zegt:
Deze moeten samengevoegd worden in 1 variabele zodat dit de uitkomst is: Jan,Sjaak,Piet
en dat kan perfect met COALESCE
Gooi dit maar eens in de query analyzer
code:
1
2
3
4
5
6
declare @s NVARCHAR(4000)

SELECT @s = COALESCE(@s+ ',','') + Naam 
from tbl_Naam where Achternaam = 'Tweakers'

PRINT @s


daar komt uit
Jan,Piet,Kees

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Verwijderd

Mooie oplossing!

Al gebruik je de coalesce natuurlijk niet voor het samenvoegen maar om aan het eind geen komma te krijgen.. Maar dat is een detail :-)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Dat die grap werkt is heel leuk, en ik kan je vertellen dat ie zelfs als zodanig beschreven is in 'A Guru's Guide To Transact-SQL', maar je moet er niet op rekenen dat ie in volgende versies van SQL Server nog steeds werkt. De reden hierachter is dat het feitelijk naar alle maatstaven gerekend een bug is dat het werkt - SQL is een set-based data manipulation language, waarbij iedere set-based operatie op zich atomair is en onderdeel uit kan maken van een grotere atomaire operatie (een 'transaction'). Als zodanig is het fout dat er tijdens het uitvoeren van de operatie procedurele side effects optreden alsof de SELECT een table scan uitvoert: je hebt enkel geluk dat ie dat intern doet.

Moraal van het verhaal: niet miepen en geen presentatie in je database-layer leggen. Je hebt nu 4 regels SQL nodig voor iets dat met 4 regels VB.NET of C# net zo goed kan en ten gevolge van de correcte locatie van de functionaliteit wel future-proof en beter maintainable is.

Professionele website nodig?

Pagina: 1