case Funktion in Abhängigkeit zweier Spalten

freedow

Benutzer
Beiträge
9
Hallo zusammen,

ich erstelle bisher folgenden view:

Code:
create view v1001_tbl_apq_mti as
select fd_title,
sum(fd_amount) as fd_amount,
fd_member_type,
fd_member_name,
case when fd_month between '02' and '04' then 'Q1' when fd_month between '05' and '07' then 'Q2' when fd_month between '08' and '10' then 'Q3'  when fd_month between '11' and '12' then 'Q4' when fd_month = '01' then 'Q4' end as fd_quarter,
fd_year
from v1000_tbl_apq_mti
group by fd_title, fd_member_type, fd_member_name, fd_quarter, fd_year;

Ich möchte gerne das die Spalte fd_year in in Abhängigkeit von fd_month folgendermassen berechnet wird:
Wenn fd_month = '01' dann verringere den Wert fd_year um 1

Probiert habe ich mit der case Funktion. Leider ohne Erfolg:

Code:
case when fd_month = '01' then fd_year = 'fd_year - 1'

Ich weiss, dass ist sicherlich falsch so. Hat jemand dafür eine Lösung?

Vielen Dank schonmal!
 
Werbung:

freedow

Benutzer
Beiträge
9
Ich brauche die Tage nicht. Das System steht schon so und deswegen kann ich grundlegende Strukturen nicht ändern. In den eigentlichen Tabellen habe ich den UNIX-Timestamp. Aber für die Filterung brauche ich später Quartale und Jahre separat. Aus den Monaten werden dann Quartale...

Gibt es zu meiner Frage eine Lösung?
 

akretschmer

Datenbank-Guru
Beiträge
9.160
Ich brauche die Tage nicht. Das System steht schon so und deswegen kann ich grundlegende Strukturen nicht ändern. In den eigentlichen Tabellen habe ich den UNIX-Timestamp. Aber für die Filterung brauche ich später Quartale und Jahre separat. Aus den Monaten werden dann Quartale...

Gibt es zu meiner Frage eine Lösung?
Sicher, sollte gehen. Ich kenne/nutze MySQL nicht. Offenbar nutzt Du ja auch keine INT-Werte, sondern Strings. Vermutlich wirst Du CASTen müssen. Was kommt denn jetzt raus? Bzw, welche Datentypen hast Du? Setze das mit dem CAST mal um, was passiert dann?


Andreas
 

ukulele

Datenbank-Guru
Beiträge
4.409
Für CASE fehlt dir schonmal ein END und Klammern würde ich es auch. Außerdem bedarf es eines Wertes, falls fd_month nicht 01 ist:
Code:
( case when fd_month = '01' then fd_year = fd_year - 1 ELSE fd_year END )
Eingearbeitet in deine View sollte das in etwa so aussehen:
Code:
create view v1001_tbl_apq_mti as
 
select    fd_title,
        sum(fd_amount) as fd_amount,
        fd_member_type,
        fd_member_name,
        ( case    when    fd_month between '02' and '04'    then 'Q1'
                when    fd_month between '05' and '07'    then 'Q2'
                when    fd_month between '08' and '10'    then 'Q3'
                when    fd_month between '11' and '12'    then 'Q4'
                when    fd_month = '01'                    then 'Q4'
        end ) as fd_quarter,
        ( case    when    fd_month = '01'                    then fd_year - 1
                else    fd_year ) as fd_year
from    v1000_tbl_apq_mti
group by fd_title, fd_member_type, fd_member_name, fd_quarter, fd_year
Allerdings bin ich mir mit den formaten nicht ganz sicher. Du kannst ja mit Text nicht rechnen es sieht aber aus als sei fd_year ein Text Feld.
 

freedow

Benutzer
Beiträge
9
DANKE!

Klappt super. Hatte die Lösung eben auch gerade selber so zusammengebastelt und festgestellt, dass das Rechnen nicht funzt.
Das Feld fd_year steht auf varchar(4). Die Kollation ist utf8_general_ci.
Ich google mal zum Thema Textfeld in ?Zahlenfeld? umwandeln.
 

freedow

Benutzer
Beiträge
9
DANKE EUCH BEIDEN!

Ich habe folgendes probiert (genauso wie nach den Tips mit zusätzlichem cast zum Umwandeln des Feldtyps):

Code:
create view v1002_tbl_apq_mti as
select fd_title,
sum(fd_amount) as fd_amount,
fd_member_type,
fd_member_name,
case when fd_month between '02' and '04' then 'Q1' when fd_month between '05' and '07' then 'Q2' when fd_month between '08' and '10' then 'Q3'  when fd_month between '11' and '12' then 'Q4' when fd_month = '01' then 'Q4' end as fd_quarter,
case when fd_month = '01' then fd_year=cast(fd_year AS UNSIGNED)-1 else fd_year end as fd_year
from v1000_tbl_apq_mti
group by fd_title, fd_member_type, fd_member_name, fd_quarter, fd_year;

Leider wird der VIEW nur mit dem Typ UNSIGNED erzeugt (siehe Zeile 7).
Gerechnet wird dann auch falsch beziehungweise gar nicht. Die betroffenen Felder haben dann den Wert '0'.
Ich brauche aber INT wenn ich richtig verstanden habe. Oder muss ich den Feldtyp schon in der Tabelle vor dem VIEW anpassen?

Im Feld fd_year sind die Jahre folgendermassen gespeichert: z.B. '2010'....

Das erste mal erzeuge ich die Spalte fd_year in einem view:
Code:
substr(cast(from_unixtime(`d`.`date`) as date),1,4) AS `fd_year` from `tl_formdata_details`
 

ukulele

Datenbank-Guru
Beiträge
4.409
Du müsstest auch mit fd_year=cast(cast(fd_year AS INT)-1 AS CHAR(4)) hin kommen, dann wirkt es sich auch nicht auf die weitere Nutzung des Feldes aus. Generell wäre ein Zahlenformat natürlich wünschenswerter aber ich weiss nicht, wo das alles weiter verwendet wird, z.B. durch Verkettung zu einem Datumswert. Ist natürlich eine frickel-Lösung.
 

freedow

Benutzer
Beiträge
9
Ich erhalte leider folgende Fehlermeldung. Kannst du damit was anfangen? Ich leider nicht...

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INT)-1 AS CHAR(4)) else fd_year end as fd_year from v1000_tbl_apq_mti group by' at line 7
 

ukulele

Datenbank-Guru
Beiträge
4.409
MySQL ist Scheisse was Fehlermeldungen angeht und das ist die Standardmeldung. Der Fehler liegt glaube ich schon in deinem Code nach then darf nur ein Wert kommen keine Gleichung:
Code:
create view v1002_tbl_apq_mti as
select fd_title,
sum(fd_amount) as fd_amount,
fd_member_type,
fd_member_name,
case when fd_month between '02' and '04' then 'Q1' when fd_month between '05' and '07' then 'Q2' when fd_month between '08' and '10' then 'Q3'  when fd_month between '11' and '12' then 'Q4' when fd_month = '01' then 'Q4' end as fd_quarter,
case when fd_month = '01' then cast(cast(fd_year AS INT)-1 AS CHAR(4)) else fd_year end as fd_year
from v1000_tbl_apq_mti
group by fd_title, fd_member_type, fd_member_name, fd_quarter, fd_year;
 

freedow

Benutzer
Beiträge
9
Leider gibt es auch ohne Gleichung eine Fehlermeldung.

Sogar nur zu CASTen gibt auch eine Fehlermeldung:
Code:
SELECT CAST(fd_year AS INT) FROM `v1001_tbl_apq_mti`
 
Werbung:
Oben