Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Probelm !!! -> Group by ? (https://www.delphipraxis.net/82440-sql-probelm-group.html)

HolgerCW 13. Dez 2006 08:57

Datenbank: ORACLE • Version: 9 • Zugriff über: TDatabase

SQL Probelm !!! -> Group by ?
 
Hallo zusammen,

komme einfach nicht weiter:

Was ist hier dran falsch:

SQL-Code:
SELECT EXTRACT(MONTH FROM ABLESEDATUM) AS MONAT, COUNT(ORT) AS ANZAHL FROM SYSSIGMA.ZST_2BMOBIL
WHERE AUFTRAGSARTEN_TEXT LIKE '%Turnuswechsel%' AND
ABLESEDATUM <= '31.12.2006' AND ABLESEDATUM >= '01.01.2006'
GROUP BY MONAT
Wenn ich anstatt 'MONAT' bei 'GROUP BY' das 'ABLESEDATUM' gruppiere ist alles OK. Wenn ich aber wie oben den 'MONAT' eintragen welchen ich über 'AS' definiere kennt er die Spalte 'MONAT' nicht.

Bitte helft mir

Gruss

Holger

Codewalker 13. Dez 2006 09:02

Re: SQL Probelm !!! -> Group by ?
 
Soweit ich weiß, kann man GROUP BY nur für Nicht-Gruppenfunktionen benutzen (also nicht für Count, etc.).

marabu 13. Dez 2006 09:05

Re: SQL Probelm !!! -> Group by ?
 
Hallo Holger,

SQL ist nicht gleich LocalSQL - du arbeitest mit LocalSQL und dort darf die GROUP BY Klausel lediglich Spalten- oder Korrelationsnamen aufweisen, keine Funktionsausdrücke.

Freundliche Grüße

mkinzler 13. Dez 2006 09:13

Re: SQL Probelm !!! -> Group by ?
 
Zitat:

SQL ist nicht gleich LocalSQL - du arbeitest mit LocalSQL
Achim traut sich nicht zu sage, daß du im Allgemeinen und speziell in diesem Fall auf die BDE verzichten solltest und auf andere, Oracle besser unterstützende, Komponenten umschwenken solltest!

HolgerCW 13. Dez 2006 09:17

Re: SQL Probelm !!! -> Group by ?
 
Danke für die Unterstützung:

Meine Lösung:

SQL-Code:
SELECT MONTH(ABLESEDATUM) AS MONAT, COUNT(AUFTRAG_ID) AS ANZAHL FROM SYSSIGMA.ZST_2BMOBIL
WHERE AUFTRAGSARTEN_TEXT LIKE '%Turnuswechsel%' AND
ABLESEDATUM <= '31.12.2006' AND ABLESEDATUM >= '01.01.2006'
GROUP BY MONTH(ABLESEDATUM)
So funktioniert es ...

Habe da aber noch eine Frage:

Diese TQuery habe ich mit einem TDBChart
verbunden. Am TDBChart werden nur auf der X-Achse 1,2,3,4,5,6,7,8,9,10,11,12 angezeigt. Wie bekomme ich dort Januar, Februar ... u.s.w. hin.

Gruss

Holger

alzaimar 13. Dez 2006 09:27

Re: SQL Probelm !!! -> Group by ?
 
Zwei Möglichkeiten:
1. Du verbastelst die Monatsnamen im SELECT. Oracle kenn ich nicht, aber unter MSSQL sieht das dann so aus:
SQL-Code:
select
  case Month(Datum)
    when 1 then 'Januar'
    when 2 then 'Februar'
    ...
    when 12 then 'Dezember'
    end as Monat,
...
from
...
group by
   case Month(Datum)
    when 1 then 'Januar'
    when 2 then 'Februar'
    ...
    when 12 then 'Dezember'
    end
2. Du erzeugst aus dem Monat (ist ja eine Zahl) ein Datum, z.B. '1.<Monat>.2006'. Im TChart wählst Du dann als Achsenformat 'mmm' oder so ähnlich. Ich habe dafür in MSSQL eine UDF geschrieben und gruppiere so:

SQL-Code:
select
  dbo.FirstOfMonth(Datum),
  Count (*)
from
...
group by dbo.FirstOfMonth(Datum)
Diese Funktion sieht so aus (Sind eigentlich zwei):
SQL-Code:
CREATE FUNCTION [dbo].[DateOnly] (@Date DateTime)
RETURNS Datetime AS
BEGIN
  Return cast (floor (cast (@Date as float)) as DateTime)
END

CREATE FUNCTION [dbo].[FirstOfMonth] (@Date DateTime)
RETURNS DateTime AS
BEGIN
  Return dbo.DateOnly (dateadd (day,-datepart (day,@Date) + 1, @Date))
END
DateOnly schnippelt den Zeit-Anteil weg.
FirstOfMonth zieht vom aktuellen Datum 'Tag-1' Tage ab. Logischerweise ist das dann der 1.des Monats.

marabu 13. Dez 2006 09:31

Re: SQL Probelm !!! -> Group by ?
 
Hallo Markus,

Zitat:

Zitat von mkinzler
Oracle besser unterstützende

oh Schreck - habe nur TDatabase gesehen, aber ist ja ORACLE. Bei ODBC ist LocalSQL kein Thema, ein Blick ins Oracle Handbuch genügt da. Um so mehr hast du Recht mit der BDE, aber wenn es ein Pflegeprojekt ist ...

@Holger: Setze einfach den Stil der Achsenbeschriftung auf Text und übersetze die Monatszahl in den MonthShortName (SysUtils) im Ereignis OnGetAxisLabel().

Freundliche Grüße

HolgerCW 13. Dez 2006 09:51

Re: SQL Probelm !!! -> Group by ?
 
Meine Güte,

soviel Input.

Das schaue ich mir mal in Ruhe an. Werde das bestimmt brauchen können.

Damit es jetzt schnell geht:

Zitat:

@Holger: Setze einfach den Stil der Achsenbeschriftung auf Text und übersetze die Monatszahl in den MonthShortName (SysUtils) im Ereignis OnGetAxisLabel().
1. Habe den Stil auf Text gesetzt.
2. Wie mache ich die Umsetzung für die Übersetzung. Im OI oder im Code ? Und wie genau mache ich das ?

Gruss

Holger

P.S.: Delphi ist für mich relativ neu

shmia 13. Dez 2006 09:51

Re: SQL Probelm !!! -> Group by ?
 
Zitat:

Zitat von alzaimar
Zwei Möglichkeiten:
1. Du verbastelst die Monatsnamen im SELECT. Oracle kenn ich nicht, aber unter MSSQL sieht das dann so 2. Du erzeugst aus dem Monat (ist ja eine Zahl) ein Datum, z.B. '1.<Monat>.2006'. Im TChart wählst Du dann als Achsenformat 'mmm' oder so ähnlich. Ich habe dafür in MSSQL eine UDF geschrieben und gruppiere so:...

3. Möglichkeit: :-D
Du erzeugst dir eine Monatstabelle mit Nummer des Monats, Monatsname und Monats-Kurzname:
1 |Januar|Jan
2 |Februar|Feb
...
12|Dezember|Dez
Diese Tabelle wird dann mit deiner Ergebnistabelle mit INNER JOIN verbunden.
Ich würde die Monatsnamen gleich in Deutsch, Englisch und Französisch vorsehen.

HolgerCW 13. Dez 2006 10:07

Re: SQL Probelm !!! -> Group by ?
 
Alles klar, das mit case funktioniert nicht ...

Da sagt er immer 'Dezmeber' ist kein gültiger Gleitkommawert ???

Vielleicht kann man mir am schnellsten mit der Umwandlung in Delphi helfen. Wie setze ich das genau um.

Dieses hier:

Zitat:

2. Wie mache ich die Umsetzung für die Übersetzung. Im OI oder im Code ? Und wie genau mache ich das ?
Neue Tabellen wollte ich für Monate jetzt nicht anlegen.

Gruss

Holger


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:40 Uhr.
Seite 1 von 2  1 2      

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