Zeile an Ergebnis anhängen

CopWorker

Newbie
Registriert
Okt. 2019
Beiträge
4
Hallo zusammen,

oft ist das einfachst das scheinbar schwierigste.

Ich habe eine kleine SQL Datenbank Tabelle namens Test_Artikel_C (SqlDataBaseTable.PNG).
Darin führe ich folgendes Sql-Select-Statement aus:
SQL:
select count(*) as 'PartOfUser', Hersteller
from Test_Artikel_C

group by Hersteller

order by Hersteller

Ergbinis:
Siehe Anhang "SqlSelectStatement.png"

Jetzt möchte ich an das Ergebnis eine Zeile anfügen.
In die Spalte "PartOfUser" soll die Summe aller existierender Werte aus dieser Spalte erscheinen und
in die Spalte "Hersteller" soll der Text "Ergebnis" erscheinen.

Mein Lösungsansatz ist folgender:
SQL:
select count(*) as 'PartOfUser', Hersteller
from Test_Artikel_C

group by Hersteller

union all 
select sum(PartOfUser) as 'PartOfUser', 'Ergebins' as Hersteller

Läuft aber leider auf einen Fehler:
Meldung 8117, Ebene 16, Status 1, Zeile 7
Der Operanddatentyp varchar ist für den sum-Operator ungültig.

Auf was muss ich in der Klammer verweisen wenn nicht auf die Spalte?
Oder wie kann ich die Ergebniszeile sonst erzeugen?

Vielen Dank für eure Hilfe.
Grüße von CopWorker
 

Anhänge

  • SqlSelectStatement.PNG
    SqlSelectStatement.PNG
    21,8 KB · Aufrufe: 292
  • SqlDataBaseTable.PNG
    SqlDataBaseTable.PNG
    84,3 KB · Aufrufe: 284
Müstte es nicht
SQL:
select sum(PartOfUser) as 'PartOfUser', Hersteller as 'Ergebnis'

sein?
 
Ja, fehlt.

UNION (und UNION ALL) verbinden zwei unabhängige, vollständige Queries miteinander. Das ist Mengentheorie - buchstäblich; es geht um A vereinigt B mit A und B als Abfragen.

Plus, die zweite Abfrage benötigt ein Group BY. SUM() ohne Group by ist sinnlos.
 
Hallo zusammen,

mental.dIseASe schrieb:
Fehlt bei dem Krempel nach dem UNION nicht ein FROM?
Ist beim kopieren nicht mitgegangen, sorry.
SQL:
select count(*) as 'PartOfUser', Hersteller
from Test_Artikel_C

group by Hersteller

union all
select sum(PartOfUser) as 'PartOfUser', 'Ergebins' as Hersteller
from Test_Artikel_C

Ändert aber nichts an der Tatsache, dass es nicht funktioniert.
RalphS schrieb:
Plus, die zweite Abfrage benötigt ein Group BY. SUM() ohne Group by ist sinnlos.
Das ist doch drin nach der ersten Abfrage.
Ein "group by" nach der zweiten Abfrage ändert auch nichts.
Und nur ein "group by" nach der zweiten Abfrage läuft erst recht auf einen Fehler:

xdave78 schrieb:
select sum(PartOfUser) as 'PartOfUser', Hersteller as 'Ergebnis'
Auch das Vertauschen des Spaltennamens mit dem Spaltenwert ändert nichts.

Eigentlich dreht sich der Fehler um den dynamischen Spaltenname "PartOfUser":
Meldung 207, Ebene 16, Status 1, Zeile 8
Ungültiger Spaltenname 'PartOfUser'.

Ist das überhaupt möglich was ich da vor habe?
Wenn nicht, lass ich´s einfach.

Vielen Dank nochmals an alle.
Grüße von CopWorker
 
SQL ist keine Tabellenkalkulation, Du kannst keine Summenzeilen anfügen.
Die musst Du in einer gesonderten Abfrage bilden.
 
Du kannst im zweiten Teil der Union nicht auf den ersten Teil der Union verweisen. Die beiden zu vereinigenden (unionisierenden) Ergebnismengen sind völlig unabhängig voneinander. Du musst den zweiten Teil also so formulieren, dass du den Kram so aggregierst, als würdest du die erste Ergebnismenge aggregieren. Denn die Summe aller nach HERSTELLER gruppierten COUNTs ist gleich dem COUNT über die gesamte Tabelle.

Also sowas wie

SQL:
SELECT
    COUNT(*) AS PARTOFUSER,
    HERSTELLER
FROM
    TEST_ARTIKEL_C
GROUP BY
    HERSTELLER
UNION ALL
SELECT
    COUNT(*) AS PARTOFUSER,
    'GESAMT' AS HERSTELLER
FROM
    TEST_ARTIKEL_C

Die Sortierung bekommst du dann auch noch hin. :)
 
Ok,
oder kann ich das Problem ganz anders angehen?
Letztendlich soll diese Abfrage für ein Dataset in einem SSRS herhalten.
Dieses Dataset soll für einen Parameter als Datenquelle dienen.
Alle Hersteller sollen in einem Dropdown Feld zur Auswahl stehen.
Den Parameter kann man zudem auf "Mehrer Werte zulassen" einstellen.
Das geht auch noch.
Nur weiß ich nicht wie ich den Filter im Dataset des Berichts gestalten soll.
Ich kann nur auf einen ausgewählten Wert (Hersteller) aus dem Dropdown Feld (Parameter) filtern,
nicht auf mehrerer.
So sieht die Syntax für meinen Filter bis jetzt aus:
SQL:
=IIF(Fields!modifyusercode.Value = Parameters!param_usercode.Value
    or Parameters!param_usercode.Value = "<Alle anzeigen>"
, "Include"
, "Exclude")
Wie kann ich den Filter gestalten, dass eine Mehrfachauswahl aus dem Parameter verarbeitet wird.

Ich habe schon gefühlt 100 Videos angeschaut. Die erzählen alle das selbe.
Nur auf den Filter wird nicht verwiesen. Das bleibt mir noch ein Rätsel.

Vielen Dank.
CopWorker
Ergänzung ()

Hi mental.dIseASe,

"sum(...)" war in dem Falle das Problem.
Mit "count(*) geht´s.
Kann ich jetzt auch noch dafür sorgen, dass die Ergebniszeile
gezielt an einer bestimmten Position steht, auch nach dem Sortieren?

Vielen Dank.
CopWorker
 
Zuletzt bearbeitet:
Den ersten Teil habe ich nicht gelesen, weil mir da gerade der Kopf zu fehlt und ich nicht weiß, was SSRS ist. Bei der Sortierung würde ich machen:

SQL:
SELECT
    *
FROM (
    SELECT
        COUNT(*) AS PARTOFUSER,
        HERSTELLER,
        0 AS ORDERDINGS
    FROM
        TEST_ARTIKEL_C
    GROUP BY
        HERSTELLER
    UNION ALL
    SELECT
        COUNT(*) AS PARTOFUSER,
        'GESAMT' AS HERSTELLER,
        1 AS ORDERDINGS
    FROM
        TEST_ARTIKEL_C
    )
ORDER BY
    ORDERDINGS ASC,
    HERSTELLER ASC NULLS FIRST
 
Hi @mental.dIseASe,

SSRS bedeutet, SQL Server Report Services.
Genauer, beim Report Service kann ich über eine URL auf vordefinierte
Inhalte einer Datenbanktabelle lesend zugreifen und diese auch in einem
gewissen erlaubten Rahmen filtern.
Ohne jegliche SQL Kenntnisse des Benutzers.

Vielen Dank für das SQL-Statement.

Grüße von CopWorker
Ergänzung ()

Hi @mental.dIseASe,

tut nicht wirklich.
Meldung 156, Ebene 15, Status 1, Zeile 20
Falsche Syntax in der Nähe des ORDER-Schlüsselworts.
 
Zuletzt bearbeitet:
TSQL kennt SELECT * FROM (SELECT ...) nicht.

Dort in etwa so:
SQL:
select 0 TKEY, tvalue ALIAS_NAME from testtbl where id = 1
union all
select 1, tvalue from testtbl where id = 2
order by TKEY, alias_name

Auch bei der MSDN fragen bzgl. UNION ALL Syntax für TSQL.


Hinweis:
Kein ORDER BY in Unterabfragen.

UNION und UNION ALL berücksichtigen für die Ergebnismenge NUR den Spaltenamen, der in der ersten Unterabfrage angegeben wurde. Aliase in weiteren Unterabfragen werden nicht berücksichtigt und sollten weggelassen werden wegen Konfusion. Wenn im ersten Subselect Alias A steht und im zweiten B und im dritten C, dann ist es trotzdem A, außer man sortiert das um, dann ist es plötzlich C. Oder B.
Daher: Nicht machen.
 
Zurück
Oben