Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Problem (https://www.delphipraxis.net/92366-sql-problem.html)

manfred_h 18. Mai 2007 17:03

Datenbank: Firbird • Version: 1.5 • Zugriff über: Fibplus

SQL Problem
 
Hallo zusammen

habe das Problem das ich mit folgendem funktionierendem SQL-Code
noch zusätlich bei COUNT( MEMBER.GIDEON_NO ) COUNT_OF_GIDEON_NO
und bei COUNT( MEMBER.AUX_NO ) COUNT_OF_AUX_NO
nur die Felder haben möchte ( beachtet werden sollen ) bei denen der wert > 0 ist
also sowas wie WHERE ((MEMBER.AUX_NO > 0))

SQL-Code:
SELECT CAMPS.C_NO, CAMPS.REG_NO, CAMPS.ZONE_NO, CAMPS.AREA_NO, CAMPS.CITY, CAMPS.COUNTRY, CAMPS.LANG,
COUNT( MEMBER.GIDEON_NO ) COUNT_OF_GIDEON_NO, COUNT( MEMBER.AUX_NO ) COUNT_OF_AUX_NO
FROM CAMPS
   INNER JOIN MEMBER ON (CAMPS.C_NO = MEMBER.C_NO)
GROUP BY CAMPS.C_NO, CAMPS.REG_NO, CAMPS.ZONE_NO, CAMPS.AREA_NO, CAMPS.CITY, CAMPS.COUNTRY, CAMPS.LANG
ORDER BY CAMPS.CITY
hat da jemand einen Tipp?

Shalom
Manfred

mkinzler 18. Mai 2007 17:14

Re: SQL Problem
 
Du mußt innerhalb des count die Werte ausfiltern, das geht mit IIF() [ab FB2] oder CASE , COLAESCE

manfred_h 18. Mai 2007 17:23

Re: SQL Problem
 
Zitat:

Zitat von mkinzler
Du mußt innerhalb des count die Werte ausfiltern, das geht mit IIF() [ab FB2] oder CASE , COLAESCE

Hi schön von Dir zu lesen. :roll:
Was macht man mit Firebird 1.5 ?
Ausser auf 2.0 Upgraden?

Sorry das ging zu schnell: Du schreibst ja > oder CASE , COLAESCE
Werde es testen.

mkinzler 18. Mai 2007 17:30

Re: SQL Problem
 
SQL-Code:
... COUNT( case when MEMBER.AUX_NO > 3 then MEMBER.AUX_NO else 0 end) ...

manfred_h 18. Mai 2007 17:49

Re: SQL Problem
 
Besten Dank :drunken:

habe es wie von Dir vorgeschlagen so gelöst:
SQL-Code:
SELECT CAMPS.C_NO, CAMPS.REG_NO, CAMPS.ZONE_NO, CAMPS.AREA_NO, CAMPS.CITY, CAMPS.COUNTRY, CAMPS.LANG,
COUNT( MEMBER.GIDEON_NO ) COUNT_OF_GIDEON_NO,
COUNT( case when MEMBER.AUX_NO >0 then MEMBER.AUX_NO else 0 end) COUNT_OF_AUX_NO
FROM CAMPS
   INNER JOIN MEMBER ON (CAMPS.C_NO = MEMBER.C_NO)
GROUP BY CAMPS.C_NO, CAMPS.REG_NO, CAMPS.ZONE_NO, CAMPS.AREA_NO, CAMPS.CITY, CAMPS.COUNTRY, CAMPS.LANG
ORDER BY CAMPS.CITY
habe nur rausgefunden das leider die möglichkeit besteht das das Feld
MEMBER.AUX_NO leer seinkann ( nicht NULL ) und dann erhalte ich eine Fehlermeldung.
Ist es möglich dies zu berücksichtigen?
Das Problem ist das wenn Der User einen Wert in das Feld eingiebt und diesen
dann weder löscht...

Manfred

mkinzler 18. Mai 2007 17:52

Re: SQL Problem
 
Welchen Typ hat das Feld?

Udontknow 18. Mai 2007 17:52

Re: SQL Problem
 
Hallo!

Kannst du das nicht einfach in die JOIN-Bedingung integrieren? Dafür müsstest du natürlich ein zweites Mal die Tabelle Members einbinden und evtl. aus dem Inner ein Left-Join machen.

SQL-Code:
SELECT CAMPS.C_NO, CAMPS.REG_NO, CAMPS.ZONE_NO, CAMPS.AREA_NO, CAMPS.CITY, CAMPS.COUNTRY, CAMPS.LANG,
COUNT( MEMBER_GID.GIDEON_NO ) COUNT_OF_GIDEON_NO, COUNT( MEMBER_AUX.AUX_NO ) COUNT_OF_AUX_NO
FROM CAMPS
LEFT JOIN MEMBER_GID ON (CAMPS.C_NO = MEMBER_GID.C_NO and MEMBER_GID.GIDEON_NO>0)
LEFT JOIN MEMBER_AUX ON (CAMPS.C_NO = MEMBER_AUX.C_NO and MEMBER_AUX.AUX_NO>0)
GROUP BY CAMPS.C_NO, CAMPS.REG_NO, CAMPS.ZONE_NO, CAMPS.AREA_NO, CAMPS.CITY, CAMPS.COUNTRY, CAMPS.LANG
ORDER BY CAMPS.CITY
Cu,
Udontknow

manfred_h 18. Mai 2007 17:54

Re: SQL Problem
 
Zitat:

Zitat von mkinzler
Welchen Typ hat das Feld?

AUX_NO T30 /* T30 = VARCHAR(30) */,

mkinzler 18. Mai 2007 17:58

Re: SQL Problem
 
SQL-Code:
COUNT( case when MEMBER.AUX_NO >0 and trim(MEMBER.AUX_No) <> '' then MEMBER.AUX_NO else 0 end)

Udontknow 18. Mai 2007 17:58

Re: SQL Problem
 
Zitat:

Zitat von manfred_h
Zitat:

Zitat von mkinzler
Welchen Typ hat das Feld?

AUX_NO T30 /* T30 = VARCHAR(30) */,

Dementsprechend natürlich angepasst:

SQL-Code:
SELECT CAMPS.C_NO, CAMPS.REG_NO, CAMPS.ZONE_NO, CAMPS.AREA_NO, CAMPS.CITY, CAMPS.COUNTRY, CAMPS.LANG,
COUNT( MEMBER_GID.GIDEON_NO ) COUNT_OF_GIDEON_NO, COUNT( MEMBER_AUX.AUX_NO ) COUNT_OF_AUX_NO
FROM CAMPS
LEFT JOIN MEMBER_GID ON (CAMPS.C_NO = MEMBER_GID.C_NO and MEMBER_GID.GIDEON_NO<>'0')
LEFT JOIN MEMBER_AUX ON (CAMPS.C_NO = MEMBER_AUX.C_NO and MEMBER_AUX.AUX_NO<>'0')
GROUP BY CAMPS.C_NO, CAMPS.REG_NO, CAMPS.ZONE_NO, CAMPS.AREA_NO, CAMPS.CITY, CAMPS.COUNTRY, CAMPS.LANG
ORDER BY CAMPS.CITY
Cu,
Udontknow

manfred_h 18. Mai 2007 18:00

Re: SQL Problem
 
Zitat:

Zitat von mkinzler
SQL-Code:
COUNT( case when MEMBER.AUX_NO >0 and trim(MEMBER.AUX_No) <> '' then MEMBER.AUX_NO else 0 end)

Sorry Trim kenn er nicht ...

Manfred

manfred_h 18. Mai 2007 18:01

Re: SQL Problem
 
Zitat:

Zitat von Udontknow
Zitat:

Zitat von manfred_h
Zitat:

Zitat von mkinzler
Welchen Typ hat das Feld?

AUX_NO T30 /* T30 = VARCHAR(30) */,

Dementsprechend natürlich angepasst:

Delphi-Quellcode:
SELECT CAMPS.C_NO, CAMPS.REG_NO, CAMPS.ZONE_NO, CAMPS.AREA_NO, CAMPS.CITY, CAMPS.COUNTRY, CAMPS.LANG,
COUNT( MEMBER_GID.GIDEON_NO ) COUNT_OF_GIDEON_NO, COUNT( MEMBER_AUX.AUX_NO ) COUNT_OF_AUX_NO
FROM CAMPS
LEFT JOIN MEMBER_GID ON (CAMPS.C_NO = MEMBER_GID.C_NO and MEMBER_GID.GIDEON_NO<>'0')
LEFT JOIN MEMBER_AUX ON (CAMPS.C_NO = MEMBER_AUX.C_NO and MEMBER_AUX.AUX_NO<>'0')
GROUP BY CAMPS.C_NO, CAMPS.REG_NO, CAMPS.ZONE_NO, CAMPS.AREA_NO, CAMPS.CITY, CAMPS.COUNTRY, CAMPS.LANG
ORDER BY CAMPS.CITY
Cu,
Udontknow

Schaue mir das auch gerade an ..

manfred_h 18. Mai 2007 18:15

Re: SQL Problem
 
Zitat:

Zitat von mkinzler
SQL-Code:
COUNT( case when MEMBER.AUX_NO >0 and trim(MEMBER.AUX_No) <> '' then MEMBER.AUX_NO else 0 end)

Habe gerade gesehen das Firebird 2.x Trim unterstüzt ....
Wechsel... :gruebel:
ok das währe dann ein neuer Thread..
Manfred

Udontknow 18. Mai 2007 18:17

Re: SQL Problem
 
Hmmm, ich glaube, die Funktionen sind auch bei 1.5 dabei, aber man muss sie einmal manuell registrieren mit einem SQL-Skript oder so. Da war irgendwas mit dem Stichwort "UDF"... Sorry, zu lange her...

Cu,
Udontknow

manfred_h 18. Mai 2007 18:19

Re: SQL Problem
 
Zitat:

Zitat von Udontknow
Hmmm, ich glaube, die Funktionen sind auch bei 1.5 dabei, aber man muss sie einmal manuell registrieren mit einem SQL-Skript oder so. Da war irgendwas mit dem Stichwort "UDF"... Sorry, zu lange her...

Cu,
Udontknow

Danke schaue mir das an..
Besten Dank dür Deine Tipps. :thumb:

manfred_h 21. Mai 2007 11:00

Re: SQL Problem
 
Hallo

hab nochmals was anderes Probiert.
SQL-Code:
COUNT( CASE WHEN MEMBER.CERT_A = 'True' THEN MEMBER.CERT_A ELSE 'False' END ) COUNT_OF_AUX_NO
Das Problemist das hier alle "Linien" gezählt werden nicht nur die bei denen
das Feld MEMBER.CERT_A True ist??

Ein Tipp?
Manfred

mkinzler 21. Mai 2007 11:18

Re: SQL Problem
 
Count zählt ja die Anzahl der Datensätze, egal welchen Wert diese haben.

manfred_h 21. Mai 2007 11:36

Re: SQL Problem
 
Ja
Du hast mir ja weiter forne einen Tipp gegeben:
SQL-Code:
COUNT( case when MEMBER.AUX_NO > 3 then MEMBER.AUX_NO else 0 end)
und hier werden doch auch "nur" die Datensätze gezählt die >3 sind oder ncht?

Udontknow 21. Mai 2007 11:46

Re: SQL Problem
 
Hallo!

probiere es mal mit "else NULL", dann dürften sie nicht mitgezählt werden.

Unabhängig davon: Funktioniert das von mir vorgeschlagene SQL nicht?

Cu,
Udontknow

manfred_h 21. Mai 2007 11:57

Re: SQL Problem
 
Zitat:

Zitat von Udontknow
Hallo!
probiere es mal mit "else NULL", dann dürften sie nicht mitgezählt werden.

Super das wars :thumb:
SQL-Code:
COUNT( CASE WHEN MEMBER.CERT_A = 'True' THEN MEMBER.CERT_A ELSE NULL END ) COUNT_OF_AUX_NO
geht einwandfrei.

Zitat:

Zitat von Udontknow
Hallo!
Unabhängig davon: Funktioniert das von mir vorgeschlagene SQL nicht?

Hab das nicht hinbekommen. Sorry ..

Danke aber vielmals Euch beiden !!
:cheers: :corky:

dfried 21. Mai 2007 11:59

Re: SQL Problem
 
Vermutlich hätte es auch so funktioniert:

SQL-Code:
SUM( CASE WHEN MEMBER.CERT_A = 'True' THEN 1 else 0 end)

manfred_h 21. Mai 2007 13:56

Re: SQL Problem
 
Zitat:

Zitat von dfried
Vermutlich hätte es auch so funktioniert:

SQL-Code:
SUM( CASE WHEN MEMBER.CERT_A = 'True' THEN 1 else 0 end)

Ja, das geht auch... Danke Dir. :thumb:
Shalom
Manfred


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:58 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 by Thomas Breitkreuz