Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

case Funktion in Abhängigkeit zweier Spalten

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von freedow, 8 Januar 2013.

  1. freedow

    freedow Benutzer

    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!
     
  2. akretschmer

    akretschmer Datenbank-Guru


    Du speicherst schon mal völlig falsch Datumswerte, denn offenbar verwendest Du dafür 3 Spalten für Tag, Monat und Jahr. Sowas ist schlicht schlecht. Gibt es dafür einen sachlichen Grund?

    Andreas
     
  3. freedow

    freedow Benutzer

    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?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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
     
    freedow gefällt das.
  5. freedow

    freedow Benutzer

    Danke. Werde ich mal googlen!
     
  6. ukulele

    ukulele Datenbank-Guru

    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 gefällt das.
  7. freedow

    freedow Benutzer

    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.
     
  8. freedow

    freedow Benutzer

    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`
     
  9. ukulele

    ukulele Datenbank-Guru

    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.
     
  10. freedow

    freedow Benutzer

    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
     
  11. ukulele

    ukulele Datenbank-Guru

    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;
     
  12. freedow

    freedow Benutzer

    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`
     
  13. ukulele

    ukulele Datenbank-Guru

  14. freedow

    freedow Benutzer

    SIGNED funktioniert leider auch. Hast du noch eine andere Idee oder Tip?
     
  15. ukulele

    ukulele Datenbank-Guru

    UNSIGNED? Du hast doch oben geschrieben das würde gehen.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden