Count in View

ChristinaSchock

Benutzer
Beiträge
5
Hallo zusammen,

ich baue gerade einen View in SSMS bei dem jede Zeile eine Auftragsposition mit einem Key ist. Der Key kann öfter vorkommen und ich würde ihn gerne in einer Spalte zählen.
Die Count Abfrage soll also für jede Zeile den Key nehmen und zählen, wie oft er unter allen Keys vorkommt.
Kann mir hier jemand helfen?
Vielen Dank schon mal.

Grüße
Christina

ALTER VIEW Viewname
AS
SELECT Ursprunstabelle *



(SELECT COUNT (Key) from Viewname GROUP BY Key) as Anzahl_Key



FROM Ursprunstabelle *
 
Zuletzt bearbeitet:
Werbung:
Das sieht etwas recursiv aus, was Du schreibst. Lass den View erstmal weg, nur das pure Select Statement.
Ich nehme an, Du willst den Key, den Du zählst auch ausgegeben haben, dann muss er mit in die select clause.
Select key, count(*) from ursprungstabelle group by key

Das create view (oder alter) kannst Du davor setzen, wenn das select läuft.
 
Vielen Dank für die schnelle Antwort!
Die Abfrage ( SELECT Farbe, COUNT (*) from Ursprungstabelle Group by Farbe ) funktioniert einwandfrei und zeigt eine Liste mit allen Keys und deren Häufigkeit.

Sobald ich diese aber in ein Alter View einbinde wirft es folgenden Fehler:


Nur ein einziger Ausdruck kann in der Auswahlliste angegeben werden, wenn die Unterabfrage nicht mit EXISTS eingeleitet wird.


Hier die Alter view Abfrage:

ALTER VIEW Viewname
AS
SELECT
*,

(SELECT Key, COUNT (*) from Ursprungstabelle Group by Key) as Anzahl_Key


FROM Ursprungstabelle
 
Soll der View denn das Ergebnis der "einwandfrei" funktionierenden Abfrage darstellen?
Dann musst Du Dir noch mal anschauen, wie man ein View definiert (oder ändert)
Was Du in Deinem Alter View Statement machst, ergibt jedenfalls keinen Sinn.
Die Definition eines Views besteht aus nichts weiter* als dem Befehl einen View anzulegen (Create View ) oder zu ändern (Alter View), plus dem eindeutigen Namen des Views (nicht evtl darin enthaltener Tabellen) einem "AS" für den besseren Sprachfluß und dem Rumpf, also dem Select Statement selbst (Das bei Dir ja bereits funktioniert).

Kurz, in Deinem Alter View Befehl ist "Select *," zuviel, zumindest wenn der View nur das funktionierende Statement darstellen soll.

Wenn Du das funktionierende Statement als Teil eines größeren Select Statements verwenden willst, empfiehlt es sich, zunächst das größere Statement lauffähig zu machen - ohne alter view.
Wenn das funktionierende Statement dabei nur ein Subselect darstellen soll, sollte es mit sehr großer Wahrscheinlichkeit per Join in das umkleidende Statement eingeschlossen werden.
Dabei sollten überall Table Aliase verwendet werden, um jede Spalte eindeutig ansprechen zu können.
Und bei der Definition eines Subselects, das in einer übergeordneten Select Clause den Wert einer Spalte liefern soll, sollte außerdem nur eine Spalte ausgegeben werden. (Es sei denn MSSQL kann Dinge, die mir nicht bekannt sind)


* in der einfachsten Form, straight forward
 
Vielen Dank für die Antwort. Als Anfänger bin ich wirklich über jede Hilfe dankbar.
Das Alter View Statement ist ziemlich lange und enthält sehr viele andere Statements und einige Joins dementsprechend auch Tablealias. Ich habe es für den Formunsbeitrag auf die wesentlichen Informationen zu beschränken versucht. Es funktioniert ohne Count einwandfrei und auch das Count Statement funktioniert ohne den View in einer eigenen Abfrage. Nur die Kombination scheint schwierig.
Ich habe jetzt jedoch für mich die Lösung gefunden, die Count Spalte erst im Frontend (PowerBI) zu generieren. Das ist zwar unschön, funktioniert aber gut. Die Challenge spare ich mir dann auf, für wenn ich mehr Erfahrung sammeln konnte.
Vielen Dank für die Hilfe!
 
Nimm doch eine "Window Funktion":

Code:
ALTER VIEW Viewname
AS
SELECT *,
      key,
      count(*) over (partition by key) as Anzahl_Key,
      ....
FROM Ursprungstabelle

key ist übrigens eine reserviertes Schlüsselwort und benötigt (im SQL Standard) Anführungszeichen: "key"

Aber Microsoft hält nix von Standards deswegen muss man die eckigen Klammern nehmen: [key] (wobei neuere Versionen von SQL Server auch mit den Anführungszeichen umgehen können).
 
..Die Challenge spare ich mir dann auf, für wenn ich mehr Erfahrung sammeln konnte.
Die Lösung von castorp ist super. Ich hatte es nicht auf dem Schirm und wusste nicht, dass MS SQL das kann. Scheint auch ganz gut zu Deinem komplexen Originalstatement zu passen.

Auch wenn man in Foren kompakte, abstrahierte Beispiele fordert und Du versucht hast, das Problem vereinfacht darzustellen, es ist nicht verkehrt, die gesamte Situation mit ein paar Worten zu umreißen. Es spart u.U. allen ein paar Schleifen.
 
Werbung:
Hallo Zusammen,
erst mal vielen Dank für die Antworten!
Hier die komplette Alter View Abfrage: Der Schlüssel (blau) wird aus einem Concat generiert und soll dann gleich in dem Count Statement gezählt werden. Was m.E. irrelevant war, habe ich für eine bessere Übersicht grau hinterlegt.
Ist die Lösung von Castrop ein Subselect? Ich konnte sie leider nicht zum laufen bringen.
Anstatt dem Spaltenname Schlüssel, setze ich das Concat Statement ein, oder?

Vielen Dank!


USE [berichtsdb]
GO

/****** Object: View [dbo].[View_Produktionsbericht_Giessen] Script Date: 10.02.2021 11:23:55 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO






ALTER VIEW [dbo].[View_Produktionsbericht_Giessen]
AS
SELECT
l.*, -- l-mobile tabelle komplett

CONVERT(date, eventtime, 112) as Datum, -- datum aus eventime

CONVERT(time,eventtime) as Uhrzeit, --zeit aus eventtime

case
when CONVERT(time,eventtime,108) > CONVERT(time,'22:00:00',108) -- wenn Uhrzeit nach 22 Uhr
then dateadd(day,1,(CONVERT(date, eventtime, 112))) -- dann nimm den nächsten Tag
else CONVERT(date, eventtime, 112) -- sonst bleibe beim aktuellen Tag
end as Datum2,



DATEPART(hour,eventtime) as Stunde, --Spalte Stunde

p.Aktiv, --Spalten aus Personno join
p.Azubi,
p.Eintrittsdatum,
p.LAN,
p.Name,
p.Praemie,
p.Spezialfertigung,
p.Surname,
p.Team,

s.zuweisung, -- Spalte aus Schichtzuweisung join

w.workplacegroupno, -- Spalte aus workplaceno join

f.doppelform, -- Spalte aus Formen join

quantity + scrap as Gesamtmenge,

DATEPART(ISO_WEEK,eventtime) as KW, --Spalte KW


CONCAT(l.personno, l.werkzeug, case
when CONVERT(time,eventtime,108) > CONVERT(time,'22:00:00',108)
then dateadd(day,1,(CONVERT(date, eventtime, 112)))
else CONVERT(date, eventtime, 112)
end,
s.zuweisung)
as Schlüssel,




CONCAT (p.Name, ' ', p.Surname) as Mitarbeiter_Name,

CONCAT (p.Praemie, p.LAN, p.Spezialfertigung, p.Azubi ) as Mitarbeiter_Eigenschaften





FROM [berichtsdb].[dbo].[lmobile_journal] l

LEFT JOIN csv_personaldaten p
ON p.personno = l.personno

LEFT JOIN csv_schichtzuweisung s
ON DATEPART(hour,eventtime) = s.Stunde

LEFT JOIN lmobile_workplace w
ON l.workplaceno = w.workplaceno

LEFT JOIN srplaner_formen f
ON l.werkzeug = f.formnr


GO
 
Zurück
Oben