Werte in Variable abspeichern

RestackZ

Benutzer
Beiträge
12
Hallo zusammen,

ich bin neu hier im Forum und habe mal eine Frage. Ich habe eine endlose SQL Abfrage geschrieben, die über mehrere Tabellen geht. Diese Werte übertrage ich an ein ActiveReport. Funktioniert auch alles soweit super. Jetzt würde ich aber gerne 2 Werte die ich aus einer Unterabfrage bekomme in eine Variable schreiben. Hier der Teil meiner Abfrage:

Code:
INNER JOIN (SELECT  COUNT(DISTINCT apk.Barcode) AS AnzahlPakete, fvp.Bezeichnung 
FROM Auftragspakete AS apk 
JOIN FraechterVerpackungsarten fvp ON fvp.Verpackungsart = apk.Verpackungsart 
WHERE apk.SendungsNr =  '10056'
AND fvp.FraechterNr = '001' 
AND not fvp.Mandant = '01' 
GROUP BY fvp.Bezeichnung) 
AS AnzahlPakete ON AnzahlPakete = AnzahlPakete AND fvp.Bezeichnung = fvp.Bezeichnung

Die Abfrage an sich gibt mir in diesem Fall aus:
Anzahl Pakete Bezeichnung
2 Euro
1 Indu

Jetzt möchte ich diese Werte wie folgt in eine Variable bekommen, dass ich dieses Ergebnis erhalte:

Euro 2; Indu 1

Wie kann ich das am Besten realisieren?

Vielen Dank für eure Hilfe
Gruß
ResatckZ
 
Werbung:
Ne StoredProc wollte ich damit nicht schreiben. Ich brauche meine Ergebnisse aus der Abfrage hintereinander geschrieben. Wie das funktioniert weiß ich nicht. Es muss ja nicht unbedingt eine Variable sein. Ich hatte nur gehofft, dass es so eine Art Möglichkeit gibt. Ich wollte dafür jetzt eigentlich nicht noch extra PHP lernen, da ich gelesen habe, dass es mit PHP möglich ist bestimmte Abfrage Ergebnisse in eine Variable zu setzen. PHP Funktioniert aber wiederum auch nicht mit ActiveReport
 
Ja klar. Ich weiß was du damit meintest. Aber wenn ich eine SP innerhalb der DB mache, bekomme ich doch nicht 1 Zeile als Ergebnis, sondern mehrere Zeilen als Ergebnis oder verstehe ich das falsch?
 
wenn es dir nur darum geht, Zeilen zu aggregieren, warum tust Du es dann nicht einfach? In PG ginge es so:

Code:
test=# select * from foo;
 id |  data  
----+--------
  1 | data 1
  2 | data 2
  3 | data 3
(3 rows)

test=*# select string_agg(data,',') from foo;
  string_agg   
----------------------
 data 1,data 2,data 3
(1 row)

test=*#


Und schon hast die 3 Zeilen der Spalte data in einer.
 
Vielen Dank! Das ist schon ziemlich nah dran. Da ich mit SQL Server 2014 arbeite und nicht mit PostgreSQL gibt es bei mir die Funktion string_agg nicht. Ich habe mal nach alternativen gesucht und konnte nicht das richtige finden. Da ich aus der Tabelle erst ein COUNT ziehe und dann will ich die beiden Ergebnisse hintereinander setzen
Code:
 Auftragspakete
-------------Barcode ----------------Verpackungsart
----------------30---------------------------2------------
----------------31----------------------------2------------
----------------32----------------------------1-------------

FraechterVerpackungsarten
---------------Verpackungsart-------------------Bezeichnung
----------------------1----------------------------------INDU-----
----------------------2----------------------------------EURO-----

Ergebnis der Abfrage:      2x EURO; 1x INDU

Code:
Mein jetziges Ergebnis sieht wie folgt aus:
Anzahl Pakete-----------Bezeichnung
------2-------------------------EURO-----
------1-------------------------INDU------
 
Ja, das ist immer wieder Schade zu sehen, daß andere DB-Systeme nicht annähernd so leistungsstark wie PostgreSQL sind ;-)

Vielleicht findet sich ein M$SQL-Guru, der eine Alternative kennt, aber Du hast so nun erst einmal die prinzipielle Lösung.

PS.: unsere Firma hat wohl auch schon hier und da von M$SQL migriert ...
 
Ja. Habe es mit Stuff auch schon probiert. Leider habe ich eine Unterabfrage über COUNT, dessen Wert ich übernehmen muss.
Code:
Select STUFF((SELECT AnzahlPakete + fvp.Bezeichnung
         from Auftragspakete apk
        join FraechterVerpackungsarten fvp on fvp.Verpackungsart = apk.Verpackungsart         
         where apk.SendungsNr = '10056' and fvp.FraechterNr = '001' and not fvp.Mandant = '01' group by fvp.Bezeichnung
           FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 2, '')
          from auftragspakete apk 
         join FraechterVerpackungsarten fvp on fvp.Verpackungsart = apk.Verpackungsart
          Inner Join (select  COUNT(DISTINCT apk.Barcode) as AnzahlPakete, fvp.Bezeichnung from Auftragspakete as apk Join FraechterVerpackungsarten fvp on fvp.Verpackungsart = apk.Verpackungsart 
where apk.SendungsNr = '10056' and fvp.FraechterNr = '001' and not fvp.Mandant = '01' group by fvp.Bezeichnung) as AnzahlPakete on AnzahlPakete = AnzahlPakete and fvp.Bezeichnung = fvp.Bezeichnung
where apk.SendungsNr =  '10056'and fvp.FraechterNr = '001' and not fvp.Mandant = '01' group by fvp.Bezeichnung, AnzahlPakete

Hier bekomme ich aber immer eine Fehlermeldung: 'Fehler beim Konvertieren des varchar-Werts 'EURO' in den int-Datentyp'
Also er erkennt alles auch einwandfrei. Nur leider will er das nicht anzeigen lassen. Ich versuche gerade die Datentypen zu ändern. Scheitere aber an dieser Aufgabe.
Ich steh im Moment auch noch auf dem Schlauch. Kann da irgendeiner vielleicht noch einmal helfen?
 
Habe meinen einen Fehler gefunden. Ich habe die Variablen mit '+' getrennt, anstatt mit ','. Wenn ich das wie folgt anpasse:

Code:
Select STUFF((SELECT ';' ,  ap  , fvp.Bezeichnung
         from Auftragspakete apk
        join FraechterVerpackungsarten fvp on fvp.Verpackungsart = apk.Verpackungsart        
         where apk.SendungsNr = '10127' and fvp.FraechterNr = '001' and not fvp.Mandant = '01' group by fvp.Bezeichnung
           FOR XML PATH('')),1,1,'') as test
          from auftragspakete apk
         join FraechterVerpackungsarten fvp on fvp.Verpackungsart = apk.Verpackungsart
          Inner Join (select  COUNT(DISTINCT apk.Barcode) as ap, fvp.Bezeichnung from Auftragspakete as apk Join FraechterVerpackungsarten fvp on fvp.Verpackungsart = apk.Verpackungsart
where apk.SendungsNr =  '10127' and fvp.FraechterNr = '001' and not fvp.Mandant = '01' group by fvp.Bezeichnung) as AnzahlPakete2 on ap = ap and fvp.Bezeichnung = fvp.Bezeichnung
where apk.SendungsNr =  '10127' and fvp.FraechterNr = '001' and not fvp.Mandant = '01' group by fvp.Bezeichnung, ap
Bekomme ich leider immer noch nicht das, was ich mir vorstelle, sondern folgende Ergebnisse:
test
<ap>1</ap><Bezeichnung> EURO</Bezeichnung>;<ap>1</ap><Bezeichnung> INDU</Bezeichnung>
<ap>2</ap><Bezeichnung> EURO</Bezeichnung>;<ap>2</ap><Bezeichnung> INDU</Bezeichnung>
<ap>1</ap><Bezeichnung> EURO</Bezeichnung>;<ap>1</ap><Bezeichnung> INDU</Bezeichnung>
<ap>2</ap><Bezeichnung> EURO</Bezeichnung>;<ap>2</ap><Bezeichnung> INDU</Bezeichnung>
Leider müsste das Ergebnis ausschließlich: '2Euro; 1Indu' sein. Hat jemand eine Idee?
 
Erste Zeile:
Code:
Select STUFF((SELECT '; ' ,+ cast(ap AS VARCHAR(10)) + fvp.Bezeichnung
und
Code:
FOR XML PATH('')),1,2,'') as test
damit kannst du dann hinter dem ; noch einen Leerschritt machen.
 
Zuletzt bearbeitet:
Werbung:
Das krieg ich ohne Testen auf die Schnelle auch nicht hin daher würde ich empfehlen die ursprüngliche Abfrage als Subselect zu machen und erst auf das Ergebnis mit stuff() zurück zu greifen.
 
Zurück
Oben