Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Suche bestimmten SQL Code (https://www.delphipraxis.net/55886-suche-bestimmten-sql-code.html)

Plague 28. Okt 2005 09:03

Datenbank: MSSQL • Version: kA • Zugriff über: ASP

Suche bestimmten SQL Code
 
Hallo,

ich habe ein Problem, ich soll eine Statistikseite programmieren. Diese wird über ASP generiert und fragt soll eine Microsoft SQL Datenbank abfragen.

Ich habe alles soweit fertig, bis auf den SQL Code. Den bekomme ich einfach nicht hin.

Und zwar soll er:
Die Anzahl aller Einträge aus 5 unterschiedlichen Spalten zusammen addieren.

Ich glaube das ist etwas blöd erklärt.
Es geht also darum abzufrufen, wieviel Eintrage in einer Datenbank vorhanden sind (aber nur aus diesen 5 Spalten - denn es gibt insgesamt 12).
Wie müsste ich sowas machen?

Gruß
Thomas

Phoenix 28. Okt 2005 09:07

Re: Suche bestimmten SQL Code
 
Das ganze sollte mit
SQL-Code:
SELECT COUNT(*) FROM tablename WHERE klausel
gehen.

Am besten machst Du 2 Schritte:

1.) Die Select-Abrage, die Dir genau die Datensätze liefert die Du zählen willst
2.) Die Abfrage der Spalten gegen COUNT(*) ersetzen.

Plague 28. Okt 2005 09:14

Re: Suche bestimmten SQL Code
 
Aber darin habe ich doch keine Addition...
Hier bekomme ich doch nur die Anzahl der Einträge.

War von mir blöd erklärt.

Das sind alles INT Datenbankspalten.
Wenn also in der
1. 5
2. 4
3. 1
4. 0 und
5. 10
stehen würde, möchte ich nicht 5 herrausbekommen weil 5 Eingaben "NOT NULL" sind, sondern ich möchte 20 herrausbekommen, weil ich 1. + 2. + 3. + 4. + 5. rechnen will!

geht sowas überhaupt?

Angel4585 28. Okt 2005 09:21

Re: Suche bestimmten SQL Code
 
Mach doch ein berechnendes Feld das die automatisch zusammenaddiert und lies dann einfach das aus

Müsste eigentlich gehen oder?

Edit:oder schau mal in der LOCALSQL.hlp nach "arithmetische Operatoren", vielleicht hilft dir das weiter

Phoenix 28. Okt 2005 09:24

Re: Suche bestimmten SQL Code
 
Zitat:

Zitat von Plague
Und zwar soll er:
Die Anzahl aller Einträge aus 5 unterschiedlichen Spalten zusammen addieren.

Das ist COUNT(*). Count gibt die Anzahl der Datensätze aus.

Was Du willst ist die SUMME der Werte in einer Spalte, und da gibt es die Funktion SUM.

SQL-Code:
SELECT SUM(spaltenname) FROM tablename WHERE klausel

Angel4585 28. Okt 2005 09:26

Re: Suche bestimmten SQL Code
 
hmm.. ich glaub ich halt mich doch besser aus solchen Dingen raus bevor ich das nicht besser kann und überlass den Profis das Feld

Phoenix 28. Okt 2005 09:32

Re: Suche bestimmten SQL Code
 
Angel: Dein Lösungsansatz ist gar nicht so abwegig. Sollte eine solche Abfrage sehr häufig abgesetzt werden müssen wäre es aller Wahrscheinlichkeit nach performanter eine View anzulegen die genau diesen Wert zurückgibt und dann nur die View abzufragen. Das Ergebnis einer View wird nämlich in aller Regel gecached bis die zugrundeliegenden Daten / Pages invalidiert werden. Eine solche Abfrage wird nicht so lange gecached und demnach häufiger durch die DB neu berechnet.

Angel4585 28. Okt 2005 10:28

Re: Suche bestimmten SQL Code
 
Zitat:

Angel: Dein Lösungsansatz ist gar nicht so abwegig. Sollte eine solche Abfrage sehr häufig abgesetzt werden müssen wäre es aller Wahrscheinlichkeit nach performanter eine View anzulegen die genau diesen Wert zurückgibt und dann nur die View abzufragen. Das Ergebnis einer View wird nämlich in aller Regel gecached bis die zugrundeliegenden Daten / Pages invalidiert werden. Eine solche Abfrage (welche meinst du, meine oder die andere?) wird nicht so lange gecached und demnach häufiger durch die DB neu berechnet.
:gruebel:

Phoenix 28. Okt 2005 11:16

Re: Suche bestimmten SQL Code
 
Huch. :oops: Sorry, ich rutsche gerne in Details ab..

Also: Eine View ist eine Art 'virtuelle' Tabelle in einer Datenbank. Diese virtuelle Tabelle ist das Ergebnis einer in die Datenbank eingegebenen Abfrage. Sozusagen eine 'fest verdrahtete' SQL-Abfrage die auf einen Tabellennamen hört.

Diese View wird erstmalig generiert wenn Du diese virtuelle Tabelle abfragt. Die Datenbank führt das Statement das hinter dieser Tabelle steht aus und merkt sich das Ergebnis sowie die Stellen wo die Daten herkommen. Diese Ergebnis wird also (im Cache) zwischengespeichert, also gecachet. Bei einer neuen Abfrage dieser View wird also das gemerkte Ergebnis ausgeliefert und es muss nicht neu berechnet werden. Das ganze ist also in der Regel schneller (performanter) als jedes mal die Abfrage selber abzuschicken.

Ändern sich nun die Daten in der Datenbank merkt diese das und verwirft (invalidiert) das Zwischenergebnis, so dass die nächste Abfrage neu berechnet und somit wieder gültig (valide) ist.

Die normale Abfrage ohne View (besser: deren Ergebnis) wird nicht so lange zwischengespeichert und demnach häufiger neu berechnet, was wieder Performance / Leistung kostet.

Angel4585 28. Okt 2005 11:32

Re: Suche bestimmten SQL Code
 
:thumb:

generic 28. Okt 2005 12:56

Re: Suche bestimmten SQL Code
 
leute, sum und count arbeiten auf zeilen.

im post oben steht was von spalten!

also eher so:
Code:
select spalte1+spalte2+spalte3 from tabellen name
spalten duerfen nicht null sein!

Angel4585 28. Okt 2005 13:04

Re: Suche bestimmten SQL Code
 
halt mal..

Zitat:

Das sind alles INT Datenbankspalten.
1.Spalte,2.Spalte ..
:warn: Spalte ist von oben nach unten

und er will jetzt die Werte der Spalten in EINER Zeile zusammenaddieren.

stimmt doch alles was wir hier gesagt haben.

Edit: Habs grad nochmal gelesen... Jetzt hab ich das nochmal anders verstanden:
in der ersten Spalte sind z.B. 5 Zeilen(Einträge)
in der zweiten Spalte sind 3 Zeilen(Einträge)

jetzt will er 8 als ergebnis, also die anzahl an einträgen. Geht das? es sind doch eigentlich immer gleich viele Zeilen oder? nur das irgendwo vielleicht nichts drin steht.

jensw_2000 29. Okt 2005 00:58

Re: Suche bestimmten SQL Code
 
Schön wäre es, wenn ich jetzt den Aufbau der besagten Tabelle kennen würde. Dann müsste ich mir nichts aus den Fingern saugen und du bräuchtest es nicht nochmal übersetzen ...

Angenommen deine Tabelle "Counters" hat den folgenden Aufbau

SQL-Code:
ID      INT
Link01   INT
Link02   INT
Link03   INT
Link04   INT
Link05   INT
Link06   INT
Link07   INT
Link08   INT
Die Daten sehen z.B. so aus ...

SQL-Code:
ID   Link01 Link02 Link03 Link04 Link05 Link06 Link07 Link08 KlicksGesamt
-------------------------------------------------------------------------------
0     NULL  NULL  3      NULL  4      NULL  NULL  NULL     -- ?? << suchst du dafür was ?
1     1      NULL  NULL  NULL  5      1      NULL  NULL
2     NULL  2      5      12     NULL  NULL  2      8

... und du möchtest generell wissen, wieviele Links bei einem Besuch geklickt wurden, dann würd auch das auch über ein berechnetes Feld lösen. Jedoch am besten über eine kleine Hilfsfunktion die ich dann anstatt des direkten Codes aufrufe ...

Eine einzelne Abfrage könnte in etwa so aussehen ...
SQL-Code:
SELECT     CASE WHEN Link02 IS NOT NULL
                 THEN Link02
                 ELSE 0
            END
            +
            CASE WHEN Link03 IS NOT NULL
                 THEN Link03
                 ELSE 0
            END
            +
            CASE WHEN Link04 IS NOT NULL
                 THEN Link04
                 ELSE 0
            END
            AS
            [Klicks_auf_Produkte]
           ,
            CASE WHEN Link05 IS NOT NULL
                 THEN Link05
                 ELSE 0
            END
            +
            CASE WHEN Link06 IS NOT NULL
                 THEN Link06
                 ELSE 0
            END
            AS
            [Klicks_auf_Downloads]
FROM Counters
WHERE ID = 1
Falls definitiv keine NULL Werte vorkommen können, dann kannst du die CASE Verschachtelung auch weglassen.

Schöne Grüße,
Jens

omata 29. Okt 2005 01:07

Re: Suche bestimmten SQL Code
 
Moin,

das Problem mit NULL-Werten kann man sehr elegant mit der COALESCE-Funktion umgehen.

SQL-Code:
SELECT COALESCE(Link02, 0) + 
       COALESCE(Link03, 0) +
       COALESCE(Link04, 0) AS [Klicks_auf_Produkte],
       COALESCE(Link05, 0) +
       COALESCE(Link06, 0) AS [Klicks_auf_Downloads]
  FROM Counters
  WHERE ID = 1
MfG
Thorsten

jensw_2000 29. Okt 2005 01:32

Re: Suche bestimmten SQL Code
 
Zitat:

Moin,

das Problem mit NULL-Werten kann man sehr elegant mit der COALESCE-Funktion umgehen.
Stimmt :mrgreen:

Jelly 29. Okt 2005 02:25

Re: Suche bestimmten SQL Code
 
Zitat:

Zitat von omata
das Problem mit NULL-Werten kann man sehr elegant mit der COALESCE-Funktion umgehen.

Oder mit isnull:
SQL-Code:
SELECT isnull(Link02, 0) + 
       isnull(Link03, 0) + 
       isnull(Link04, 0) AS [Klicks_auf_Produkte],
       isnull(Link05, 0) + 
       isnull(Link06, 0) AS [Klicks_auf_Downloads]
  FROM Counters
  WHERE ID = 1
Gibts da einen Unterschied zwischen isnull und COALESCE :gruebel:

Luckie 29. Okt 2005 06:45

Re: Suche bestimmten SQL Code
 
Zitat:

Zitat von Jelly
Gibts da einen Unterschied zwischen isnull und COALESCE :gruebel:

Das erstere läßt sich auf alle Fälle aussprechen ohne sich die Zunge zu verdrehen. ;) :duck:

Phoenix 29. Okt 2005 07:08

Re: Suche bestimmten SQL Code
 
Wie kommt ihr auf einmal auf eine Quer berechnete Summe?

.oO(Ich liebe klare Fragestellungen ohne Beispiele...)

jensw_2000 29. Okt 2005 08:16

Re: Suche bestimmten SQL Code
 
Zitat:

Zitat von Phoenix
Wie kommt ihr auf einmal auf eine Quer berechnete Summe?

.oO(Ich liebe klare Fragestellungen ohne Beispiele...)

:arrow: Erst verwirrend aber doch klar oder ?

jensw_2000 29. Okt 2005 09:18

Re: Suche bestimmten SQL Code
 
Zitat:

Zitat von Jelly
Gibts da einen Unterschied zwischen isnull und COALESCE :gruebel:

Jepp,

COALESCE gibe den ersten Wert einer Liste zurück, der nicht NULL ist. Wenn alle Werte NULL sind ist das Ergebnis egenfalls NULL.

SQL-Code:
 
COALESCE(NULL,NULL,NULL,2,3,NULL) --ergibt 2
COALESCE(NULL,NULL,NULL) --ergibt NULL
ISNULL ersetzt NULL-Ausdrücke durch einen gezielten Ersatzwert.

SQL-Code:
ISNULL(NULL,0) --ergibt 0
ISNULL( 'Egal'+CAST(NULL AS VARCHAR(5)) ,'') --ergibt ''

Schöne Grüße,
Jens
:hi:

Jelly 29. Okt 2005 09:37

Re: Suche bestimmten SQL Code
 
Danke Jens :zwinker:
Dann ist IsNull also lediglich ein Spezialfall von Coalesce


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz