Delphi-PRAXiS

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 09: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 10: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 10: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 10: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 10: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 10: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 10: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 10: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 10: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 11: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

mkinzler 13. Dez 2006 11:08

Re: SQL Probelm !!! -> Group by ?
 
'Dezember' ist ja auch ein String. Case geht nur mit Ordinalzahlen. Zeig mal deinen Code.

HolgerCW 13. Dez 2006 11:10

Re: SQL Probelm !!! -> Group by ?
 
Hier der Code:

SQL-Code:
SELECT CASE MONTH(ABLESEDATUM) WHEN 10 then 'Oktober' WHEN 11 then 'November' WHEN 12 then 'Dezember' END 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 CASE MONTH(ABLESEDATUM) WHEN 10 THEN 'Oktober' WHEN 11 then 'November' WHEN 12 then 'Dezember' END

marabu 13. Dez 2006 11:22

Re: SQL Probelm !!! -> Group by ?
 
Eigentlich müsste doch das hier genügen:

Delphi-Quellcode:
procedure TDemoForm.ChartGetAxisLabel(Sender: TChartAxis;
  Series: TChartSeries; ValueIndex: Integer; var LabelText: String);
begin
  LabelText := ShortMonthNames[Trunc(Series.XValue[ValueIndex])];
end;
Freundliche Grüße

HolgerCW 13. Dez 2006 11:35

Re: SQL Probelm !!! -> Group by ?
 
Jetzt komme ich da schon weiter:

oben stand nämlich

Zitat:

MonthShortName
So konnte das ja nicht klappen, wenn es eigentlich

Zitat:

ShortMonthNames
heissen muss.

Leider klappt es mit

Zitat:

LabelText := ShortMonthNames[Trunc(Series.XValue[ValueIndex])];
nicht. Kommt eine Speicherzugriffsverletzung. Vielleicht eine Idee ???

Gruss

Holger

marabu 13. Dez 2006 11:40

Re: SQL Probelm !!! -> Group by ?
 
Sorry für den Dreher. Wenn deine Monatswerte alle im Ergebnis vorkommen, dann geht es auch einfacher:

Delphi-Quellcode:
LabelText := ShortMonthNames[Succ(ValueIndex)];
Gruß

HolgerCW 13. Dez 2006 11:55

Re: SQL Probelm !!! -> Group by ?
 
Bei der Lösung steht dann überall hh:mm:ss

Habe es jetzt so gelöst:

Delphi-Quellcode:
if LabelText = '1' then LabelText := 'Januar';
if LabelText = '2' then LabelText := 'Februar';
if LabelText = '3' then LabelText := 'März';
if LabelText = '4' then LabelText := 'April';
if LabelText = '5' then LabelText := 'Mai';
if LabelText = '6' then LabelText := 'Juni';
if LabelText = '7' then LabelText := 'Juli';
if LabelText = '8' then LabelText := 'August';
if LabelText = '9' then LabelText := 'September';
if LabelText = '10' then LabelText := 'Oktober';
if LabelText = '11' then LabelText := 'November';
if LabelText = '12' then LabelText := 'Dezember';
Wie kriege ich das hin das er das nur Beschriftet wenn die X-Achse dran ist.

Gruss

Holger

marabu 13. Dez 2006 13:39

Re: SQL Probelm !!! -> Group by ?
 
Das hier funktioniert bei mir:

Delphi-Quellcode:
procedure TDemoForm.ChartGetAxisLabel(Sender: TChartAxis;
  Series: TChartSeries; ValueIndex: Integer; var LabelText: String);
begin
  if (ValueIndex in [0..11]) and (Sender = Sender.ParentChart.BottomAxis) then
    LabelText := ShortMonthNames[Trunc(Series.XValue[ValueIndex])];
end;
Series ist die einzige bzw. relevante Serie im Chart. Den Namen musst du natürlich an deine Verhältnisse anpassen.

Freundliche Grüße

HolgerCW 13. Dez 2006 14:40

Re: SQL Probelm !!! -> Group by ?
 
Das macht Probleme bei mir:

Delphi-Quellcode:
LabelText := ShortMonthNames[Trunc(Series.XValue[ValueIndex])];
Kommt immer eine Speicherverletzung

Dieser Zusatnd tritt nie ein:

Delphi-Quellcode:
if (ValueIndex in [0..11]) then
Habe es jetzt aber so gelöst, und das reicht mir jetzt erstmal:

Delphi-Quellcode:
if Sender = Sender.ParentChart.BottomAxis then
 begin
  if LabelText = '1' then LabelText := 'Januar';
  if LabelText = '2' then LabelText := 'Februar';
  if LabelText = '3' then LabelText := 'März';
  if LabelText = '4' then LabelText := 'April';
  if LabelText = '5' then LabelText := 'Mai';
  if LabelText = '6' then LabelText := 'Juni';
  if LabelText = '7' then LabelText := 'Juli';
  if LabelText = '8' then LabelText := 'August';
  if LabelText = '9' then LabelText := 'September';
  if LabelText = '10' then LabelText := 'Oktober';
  if LabelText = '11' then LabelText := 'November';
  if LabelText = '12' then LabelText := 'Dezember';
 end;
Habe noch den Sender verwendet. Jetzt habe ich das was ich wollte.

Danke nochmal

Gruss

Holger

marabu 13. Dez 2006 14:47

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

Delphi-Quellcode:
procedure TDemoForm.ChartGetAxisLabel(Sender: TChartAxis;
  Series: TChartSeries; ValueIndex: Integer; var LabelText: String);
var
  iMonth: Integer;
begin
  if TryStrToInt(LabelText, iMonth)
  and (iMonth in [1..12])
  and (Sender = Sender.ParentChart.BottomAxis) then
    LabelText := LongMonthNames[iMonth];
end;
sieht irgendwie hübscher aus - findest du nicht?

Freundliche Grüße

HolgerCW 13. Dez 2006 16:36

Re: SQL Probelm !!! -> Group by ?
 
Das ist sie.

Deine Lösung ist gut. Kurz und Präzise. Klappt.

Danke ...

Gruss

Holger


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 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