Announcement

Collapse
No announcement yet.

Ausgabe von Spalten wenn wert gleich FAIL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ausgabe von Spalten wenn wert gleich FAIL

    Hallo,

    ich versuche seit Tagen folgendes Problem zu lösen und frage mich mittlerweile ob die von mir gewünschte Abfrage überhaupt geht...

    Tabelle Test
    Testname|Check_01|Check_02|Check_03
    -------------------------------------------------------------
    Test1|PASS|FAIL|PASS
    Test2|FAIL|FAIL|FAIL
    Test3|PASS|PASS|FAIL


    Ich suche eine Abfrage welche mir nur die Spalten anzeigt in dem FAIL steht, wobei die Abfrage eingeschränkt wird durch die Spalte Testname ( d.h. where TestName = 'Test1' )

    Erwartetes Ergebnis bei where TestName = 'Test1':

    TestName|Check_02
    -------------------------------------
    Test1|FAIL


    Erwartetes Ergebnis bei where TestName = 'Test2':

    Testname|Check_01|Check_02|Check_03
    -------------------------------------------------------------
    Test2|FAIL|FAIL|FAIL

    usw

    Hoffe ich habe mich klar ausgedrückt und ihr mir weiterhelfen könnt.

    Dank und Gruß,

    dodger

  • #2
    Ist der Testname immer eindeutig und gibt es genau nur diese 3 Spalten und diese beinhalten immer exakt 'PASS' oder 'FAIL' ?
    Wenn ja, hier mal ein "quick and dirty" zm Testen in einem Abfragetool deiner Wahl:
    Code:
    create table #tbl (
    tname   varchar(20),
    check1  varchar(10),
    check2  varchar(10),
    check3  varchar(10) )
    
    insert into #tbl values('Test1','PASS','FAIL','PASS')
    insert into #tbl values('Test2','FAIL','FAIL','FAIL')
    insert into #tbl values('Test3','PASS','PASS','FAIL')
    
    declare @tname varchar(20)
    set @tname = 'Test2'
    
    if exists(select * from #tbl where tname = @tname and check1 = 'PASS' and check2 = 'PASS' and check3 = 'FAIL')
      select @tname, 'FAIL' as check3
    else if exists(select * from #tbl where tname = @tname and check1 = 'PASS' and check2 = 'FAIL' and check3 = 'FAIL')
      select @tname, 'FAIL' as check2, 'FAIL' as check3
    else if exists(select * from #tbl where tname = @tname and check1 = 'FAIL' and check2 = 'FAIL' and check3 = 'FAIL')
      select @tname, 'FAIL' as check1, 'FAIL' as check2, 'FAIL' as check3
    else if exists(select * from #tbl where tname = @tname and check1 = 'FAIL' and check2 = 'FAIL' and check3 = 'PASS')
      select @tname, 'FAIL' as check1, 'FAIL' as check2
    else if exists(select * from #tbl where tname = @tname and check1 = 'FAIL' and check2 = 'PASS' and check3 = 'PASS')
      select @tname, 'FAIL' as check1
    else if exists(select * from #tbl where tname = @tname and check1 = 'FAIL' and check2 = 'PASS' and check3 = 'FAIL')
      select @tname, 'FAIL' as check1, 'FAIL' as check3
    else if exists(select * from #tbl where tname = @tname and check1 = 'PASS' and check2 = 'FAIL' and check3 = 'PASS')
      select @tname, 'FAIL' as check2
    else select @tname
    
    drop table #tbl
    bye,
    Helmut

    Comment


    • #3
      Hallo,

      vielen Dank erst einmal für die Antwort welche mir in der Tat das gewünschte Ergebnis liefert, aber die Praxis sieht ein wenig anders aus.

      Der Testname ist in der Tat immer eindeutig und die Spalten enthalten immer FAIL oder PASS aber die Anzahl ist leider nicht nur drei sondern 105! Spalten.

      Gibt es vielleicht eine kleinere, schlankere Version?

      Gruß,

      Dodger

      Comment


      • #4
        Hallo,

        ich weiß nicht seit welcher Version es NULLIF gibt. Aber diese Funktion wäre m. E. das einfachste:

        Select Testname, NULLIF(Check_01,'PASS'), NULLIF(Check_02,'PASS'), ...

        usw.

        Gruß
        Zuletzt editiert von frauwue; 10.11.2008, 13:45.
        docendo discimus

        Comment


        • #5
          Hallo,

          das sieht doch schon mal nicht schlecht aus
          Jetzt fehlt nur noch das die NULL Felder nicht mehr angezeigt werden.

          Gruß,

          dodger

          Comment


          • #6
            Hallo dodger,

            dachte mir ja schon, dass da noch wo ein Haken ist
            Bei so vielen Feldern geht es wohl nur mehr mit dynamischen SQL und/oder einer UDF - muss mal ein bisschen drüber nachdenken ...

            bye,
            Helmut

            Comment


            • #7
              Hi,

              willst Du den Text am Stück oder in Spalten?

              Die Anzahl m der FAIL Spalten kannst Du Dir mit dem ASCII Code berechnen:
              ASCII('FAIL') ergibt 70 ASCII('PASS')= 80.

              Das heißt, wenn Du schreibst:

              (wobei n die Anzahl der gesamten Spalten ist)

              (ASCII(check01)+...+ASCII(checkn)-n*80)/(-10)
              erhälst Du die Anzahl der FAIL-Spalten m

              Mit
              SELECT Left('FAILFAIL...FAIL', 4*m)

              wobei Du für m den obigen Ausdruck einsetzt
              erhälst Du die gewünschte Anzahl von FAILs am Stück in einem SELECT.

              Gruß
              docendo discimus

              Comment


              • #8
                Hallöle,

                wow jetzt geht es ans eingemachte.

                Die ursprüngliche Idee war es, dass ich für den die einzelnen Server die Spalten angezeigt bekomme in denen FAIL steht.

                AAAAber, wenn es natürlich möglich ist dieses als ein "String" anzuzeigen wäre das natürlich die schönere Möglichkeit.

                Das würde bedeuten für:

                Test2|Check_01:FAIL, Check_02:FAIL, Check_03:FAIL...

                Wie muss die Query dafür aussehen???

                Gruß,

                Dodger

                Comment


                • #9
                  SELECT Testname,
                  Left('FAILFAILFAIL', 4*((ASCII(check01)+ASCII(check02)
                  +ASCII(check03)-3*80)/(-10)))
                  where testname=...

                  (Ich hoffe, ich habe mich bei den Klammern nicht verzählt)
                  docendo discimus

                  Comment


                  • #10
                    Hmmmm,

                    wir kommen der Sache schon näher, aber leider ist es immer noch nicht so ganz das was ich haben möchte....

                    Als Ergebnis mit deiner Query bekomme ich

                    Test2|FAILFAILFAIL

                    Besser würde es aber so aussehen:

                    Test2|Check_01:FAIL, Check_02:FAIL, Check_03:FAIL

                    Ferner bedeutet das aber doch auch, das ich die FAILS vorher schon manuell zähle, oder?

                    Gruß,


                    Dodger
                    Zuletzt editiert von dodger; 10.11.2008, 17:30.

                    Comment


                    • #11
                      Hi,

                      das mit der Beschriftung krieg ich jetzt nicht so auf die Schnelle hin (wenn überhaupt). Hier noch eine Ergänzung zu meinem allerersten Vorschlag:

                      Select Testname, isnull(NULLIF(Check_01,'PASS'),' '),isnull(NULLIF(Check_02,'PASS'),' '), ...

                      Dann erscheinen wenigstens die NULLs nicht sondern nur Blanks.

                      Gruß
                      docendo discimus

                      Comment


                      • #12
                        Was sagst du dazu ?

                        Code:
                        create table #tmp (
                          tname    varchar(20),
                          check1   varchar(10),
                          check2   varchar(10),
                          check3   varchar(10),
                          check4   varchar(10),
                          check5   varchar(10),
                          check6   varchar(10),
                          check7   varchar(10),
                          check8   varchar(10),
                          check9   varchar(10),
                          check10  varchar(10),
                          check11  varchar(10),
                          check12  varchar(10),
                          check13  varchar(10),
                          check14  varchar(10),
                          check15  varchar(10),
                          check16  varchar(10),
                          check17  varchar(10),
                          check18  varchar(10),
                          check19  varchar(10),
                          check20  varchar(10) )
                        
                        insert into #tmp values('test1',
                          'FAIL', 'FAIL', 'PASS', 'FAIL', 'PASS',
                          'PASS', 'FAIL', 'PASS', 'FAIL', 'PASS',
                          'FAIL', 'FAIL', 'PASS', 'PASS', 'PASS',
                          'PASS', 'PASS', 'PASS', 'FAIL', 'PASS' )
                        
                        create table #cmd (command varchar(2000))
                        declare @x int, @tname varchar(20), @cmd varchar(2000)
                        select @x = 1, @tname = 'test1'
                        insert into #cmd values('select tname')
                        while @x <= 20 begin
                          select @cmd = 'update #cmd set command = command + (case when (select check' + cast(@x as varchar) +
                            ' from #tmp where tname = ''' + @tname + ''') = ''FAIL'' then '', check' + cast(@x as varchar) + ''' else '''' end)'
                          exec(@cmd)
                          set @x = @x + 1
                        end
                        select @cmd = command + ' from #tmp' from #cmd
                        exec(@cmd)
                        
                        drop table #tmp
                        drop table #cmd
                        ... einfach mal in einem QueryTool ausprobieren

                        bye,
                        Helmut

                        Comment


                        • #13
                          Helmut,

                          Du bist mein Held, genau das ist es was ich gesucht habe.

                          Vielen vielen Dank....

                          Gruß,

                          dodger

                          Comment

                          Working...
                          X