![]() |
SQL - SUM() und FieldType Bit
Hab da mal ne Frage ...
Folgende Problematik: ich brauche eine Abfrage (oder besser function) die Summe einer Spalte mit Bit-Werten als Bit oder Bool zurückgibt... Teilauftrag.istAbgerechnet (bit)
SQL-Code:
SELECT sum(Teilauftrag.istAbgerechnet) AS Alle_TA_Abgerechnet
FROM Teilauftrag WHERE Teilauftrag.Auftragsnummer = 'A2004-0012' Dachte eigentlich dass das so funktioniert, aber die MSDE sagt mit bein Ausführen der Abfrage: "The sum or average aggregate operation cannot take a bit data type as an argument" Hat das schon mal jemand versucht ein Bit Feld mit einer SQL-Function zu berechnen ? Klappt das oder kann ich mit die Arbeit sparen ? |
Re: SQL - SUM() und FieldType Bit
Willst du die Anzahl wissen wieviele Abgerechnet sind?
Dann musst du mit Count arbeiten:
SQL-Code:
Count gibt die Anzahl der Datensätze zurück. über das zusätzliche Where werden nur die abgerechneten gezählt. (weiss nicht ob es so 100% syntaktisch richtig ist, am besten mal probieren).
SELECT count(Teilauftrag.istAbgerechnet) AS Alle_TA_Abgerechnet
FROM Teilauftrag WHERE Teilauftrag.Auftragsnummer = 'A2004-0012' and Teilauftrag.istAbgerechnet |
Re: SQL - SUM() und FieldType Bit
Ich will wissen, ob alle Teilaufträge eines Auftrags abgerechnet sind oder nicht ...
|
Re: SQL - SUM() und FieldType Bit
Dann musst du vermutlich zwei Abfragen machen. In der ersten ermittelst du die Anzahl aller Fälle (also ohne das "and Teilauftrag.istAbgerechnet" in Where) und beim zweite mal damit. Dann hast du die Gesamtzahl der Fälle und die Anzahl der abgerechneten. Ob es eine einfachere Möglichkeit gibt weis ich nicht, aber so würde ich es erstmal machen, bis mir was besseres einfällt.
|
Re: SQL - SUM() und FieldType Bit
ist eventuell etwas zu ungenau
Also: Alle Teilaufträge werden beim Erfassen in die Tabelle "Teilauftrag" geschrieben. Nun sollen Teilaufträge zu einem Gesamtauftrag zusammengefasst werden. Dazu eine Tabelle Auftrag. Der Kunde erstellt einen Auftrag und ordnet ihm alle dazugehörenden Teilaufträge zu. Der Unique Key aus "Auftrag" wird in die Spalte Teilauftrag.Auftragsnummer bei allen ausgewählten Teilaufträgen geschrieben ... Nun sollen die Teilaufträge einzeln abgerechnet werden können. Ich muss nun herausfinden können, ob alle Teilaufträge eines Auftrags abgerechnet sind. Mit nem Stückchen Code nicht schwer, aber schneller und eleganter wäre das sicher per SQL. Schade nur, das SUM() keine Bit Addition unterstützt ... |
Re: SQL - SUM() und FieldType Bit
Du könntest doch das Feld istAbgerechnet als NUMBER mit einem Zeichen machen. 1 = bedeutet abgerechnet, 0 = nicht abgerechnet. Jetzt könntest du eine Abfrage machen:
SQL-Code:
Sind beide Felder gleich des Selects gleich, wäre alle Aufträge abgerechnet. Um deiner Forderung nach zu kommen, dass wenn möglich ohne programm zu machen, könnte man vielleicht das Select leicht anpassen:
SELECT sum(Teilauftrag.istAbgerechnet) AS TA_Abgerechnet,
count(*) AS TA_Anzahl FROM Teilauftrag WHERE Teilauftrag.Auftragsnummer = 'A2004-0012'
SQL-Code:
Dann müsste eigentlich True oder false rauskommen.
SELECT sum(Teilauftrag.istAbgerechnet)=count(*) AS TA_alle_Abgerechnet
FROM Teilauftrag WHERE Teilauftrag.Auftragsnummer = 'A2004-0012' |
Re: SQL - SUM() und FieldType Bit
OK, werde mal ein paar Tests in diese Richtung starten ...
Danke :cheers: |
Re: SQL - SUM() und FieldType Bit
OK, das ist es:
SQL-Code:
Erbebnis: funktioniert :P :
CREATE FUNCTION Alle_TA_Abgerechnet (@Auftragsnummer nvarchar(19))
RETURNS bit AS BEGIN declare @gesamtTA smallint declare @abgerechnetTA smallint declare @KomplettErledigt bit select @GesamtTA = count(Teilauftrag.istAbgerechnet) From Teilauftrag Where Teilauftrag.Auftragsnummer = @Auftragsnummer select @AbgerechnetTA = count(Teilauftrag.istAbgerechnet) From Teilauftrag Where Teilauftrag.Auftragsnummer = @Auftragsnummer AND (Teilauftrag.istAbgerechnet=1 OR Teilauftrag.istStorniert=1) SELECT @KomplettErledigt = CASE WHEN @GesamtTA-@AbgerechnetTA = 0 THEN 1 ELSE 0 END return @KomplettErledigt END
SQL-Code:
SELECT Auftragsnummer,
..., Alle_TA_Abgerechnet(Auftragsnummer) as KomplettAbgerechnet FROM Auftrag INNER JOIN Teilauftrag ON Auftrag.Auftragsnummer = Teilauftrag.Auftragsnummer WHERE ... |
Re: SQL - SUM() und FieldType Bit
Hallo,
warum fragst du die Tabelle zweimal ab? Ziehe dir doch einfach die Anzahl aller nicht (!) abgerechneten Teilaufträge; ist die größer 0, dann ist der Auftrag nicht komplett abgerechnet... Bei großen Tables (evtl. ohne entsprechende Indizes) kann das eine Menge Arbeit für die DB sparen! Viel Spaß Peter |
Re: SQL - SUM() und FieldType Bit
Stimmt.
:wall: Danke, das spart bei der jetzigen Datenmenge schon ca. 0,4 Sekunden pro Abfrage. In 10 Jahren müssen die Leute wegen dir auf die Kaffepause verzichten ... :mrgreen: Ne... habe ich echt nicht gesehen. Ich war froh endlich eine funktionierende Lösung zu haben. Danke |
Re: SQL - SUM() und FieldType Bit
nur der Vollständigkeit halber:
SQL-Code:
funktioniert auch mit Bitfeldern
SELECT count(*) AS Ges
, SUM(CASE WHEN Bitfeld=1 THEN 1 ELSE 0 END) AS BitOn , SUM(CASE WHEN Bitfeld=1 THEN 0 ELSE 1 END) AS BitOff FROM TABELLE WHERE <BEDINGUNG> |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz