Announcement

Collapse
No announcement yet.

SQL Abfrage Ansatz?

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

  • SQL Abfrage Ansatz?

    Hallo!



    Ich habe eine Datenbank wo diverse Artikel mit eindeutigen Seriennummern und verschiedenen Attributen vorkommen. Ich will:

    Bsp.: (mir geht es hier nur um die Seriennummer und einem Attribut "Lagerdistribution")



    1,2,3,4 ... Seriennummern

    A,B ... Eigenschaften des Attributs Lagerdistribution



    Datenbank:



    1 A

    1 B

    2 A

    3 A

    3 B

    4 A



    Ich will nur die Artikel (Seriennummern) ausgeben die NUR Lagerdistribution A aufweisen.



    Lösung wäre also hier Artikel 2 und 4 ....



    Weis jemand einen Ansatz mit einer SQL Abfrage?



    p.s.: schlußendlich will ich dann alle Artikel Ausgeben die Lagerdistribution X oder Y haben aber NOCH NICHT Z oder W oder U. (X,Y,Z,W,U sind alles eine Eigenschaft des Attributes Lagerdistribution)



    Geht dies mit SQL? Hat jemand einen Ansatz?

    Realisieren werde ich es mit VBA Excel danke!

  • #2
    Naja, geht schon mit SQL, die Frage ist nur, was wird neben Excel noch verwendet? Für SQL muss, soviel ich weiß, eine Datenbank eingebunden werden, auf Zellen alleine geht kein SQL, oder?
    Und wenn es eine Datenbank gibt, welche ist das? SQL-Dialekte sind unterschiedlich und gerade bei komplexeren Abfragen kommt es meistens sogar auf die Versionsnummer der DB an. Was wird hier verwendet?

    Hier mal ein Ansatz für SQL:

    select seriennummer from tabelle as A where not exists
    (select 1 from tabelle as B where B.seriennummer = A.seriennummer
    and B.attribut <> 'A')

    bye,
    Helmut

    Comment


    • #3
      Originally posted by hwoess View Post
      Für SQL muss, soviel ich weiß, eine Datenbank eingebunden werden, auf Zellen alleine geht kein SQL, oder?
      Doch, man kann eine Excel Datei auch via ODBC oder OLE DB ansprechen und SQL Statements ausführen. Ob man auch INSERT oder UPDATE machen kann weiss ich aber nicht.

      Man muss nur einen "benannten Bereichen" erzeugen.

      Gruss

      Comment


      • #4
        Gibt es da irgendwo Info im Netz darüber? SQL ist ja eigentlich nur was für relationale Datenbanken und da rechne ich Excel nicht dazu. Aber man lernt ja nie aus. Allerdings waren meine Google-Versuche bisher nicht von Erfolg gekrönt. Also bitte mal irgendeinen Link zum starten

        thanks,
        Helmut

        Comment


        • #5
          Hier eine Anleitung von Microsoft: Using ADO to Query an Excel Spreadsheet

          Und ein Beispiel als VB-Script:

          [highlight=vb]
          'Benannten Bereich festlegen
          Set objExcel = CreateObject("Excel.Application")
          objExcel.Workbooks.Open("c:\MeineDatei.xls")
          objExcel.ActiveWorkbook.Names.Add "Daten", =Sheet1!R1C1:R100C10
          objExcel.ActiveWorkbook.Save
          objExcel.Application.Quit

          'SQL Abfrage via ADO
          Set con = CreateObject("ADODB.Connection")
          Set cmd = CreateObject("ADODB.Command")
          Set rs = CreateObject("ADODB.Recordset")
          con.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=c:\MeineDatei.xls"
          con.Open
          Set cmd.ActiveConnection = con
          cmd.CommandText = "SELECT * FROM Daten WHERE ""Project ID"" > 0"
          Set rs.Source = cmd
          rs.Open

          Do Until rs.EOF
          Wscript.Echo rs("Project ID").Value
          rs.MoveNext
          Loop
          rs.Close
          [/highlight]

          Das VBS Beispiel habe ich aus einem funktionierenden Skript extrahiert, kann sein dass kleine Fehler drin sind. Es gibt dir aber sicher eine Idee wie es funktioniert.

          Gruss

          Comment


          • #6
            Okay, danke. Irgendwie witzig, was alles geht. Werde bei Gelegenheit mal schauen, ob es mehr als ein einfaches SELECT gibt - ich vermute schon

            bye,
            Helmut

            Comment


            • #7
              Originally posted by hwoess View Post

              Hier mal ein Ansatz für SQL:

              select seriennummer from tabelle as A where not exists
              (select 1 from tabelle as B where B.seriennummer = A.seriennummer
              and B.attribut <> 'A')
              Hallo!

              Ich brauche wirklich nur den sql ansatz den rest habe ich schon danke =)

              hm warum setzt du bei der unterabfrage direkt 1 (also eine seriennummer ein) . Was bedeutet der befehl "AS"?

              Comment


              • #8
                Ich habe da keine Seriennummer eingesetzt sondern einfach einen fixen Wert. ich hätte auch 'blabla' oder 123456789 oder * hinschreiben können, weil's egal ist, was zurückkommt, denn das davorstehende WHERE NOT EXISTS testet nur, ob mindest ein Datensatz dazu existiert oder nicht.
                Und mit AS kann man einer Tabelle oder Spalte oder einem Ergebnis einen kürzeren oder sprechenderen oder anderen Namen geben - braucht man speziell dann, wenn man dieselbe Tabelle mehr als einmal in derselben Query verwendet!

                bye,
                Helmut

                Comment


                • #9
                  Hier nochmal kurz das was ich will:





                  x und y sind zwei lieferanten

                  g,h,j,k sind eben 4 verschiedene Kunden ....


                  Ich will wie die waren die noch auf lager sind also nicht einen kunden zugewiesen haben (g,h,j,k) aber durch einen der zwei händler (x oder y - ACHTUNG: es kann auch vorkommen das eine Seriennummer beide also x und y zugewiesen hat - wenn beide dann ist das auch ok) ins unternehmen gekommen sind ....
                  und wichtig jede Seriennummer nur einmal (unicat) ....

                  im nächsten post wäre mein ansatz, der, so glaube ich, richtig sein müsste

                  Zur Erklärung des Codes:

                  Bei der where abfrage filtere ich alle seriennummer heraus die nicht bei einem der kunden geloggt wurde UND dann schaue ich ob es von Lieferant X oder Y kommt ....

                  wenn die beiden bedinungen erfüllt sind ... wird die Seriennummer ausgegen ...

                  vll noch wichtig: es gibt sehr viele Attribute die eine Seriennumer aufweisen kann ... darum scheint es mir wichtig bei der abfrage nicht nur auszuschließend abzufragen sondern gezielt auf die bedingungen einzugehen ....
                  Zuletzt editiert von harry6233; 19.07.2011, 16:54.

                  Comment


                  • #10
                    Hier mein neuer und soweit ich glaube richtiger Ansatz:

                    SELECT COUNT(DISTINCT A.SERIAL_NUM), Tab2.Produktname FROM Tab1 AS A, Tab2
                    WHERE NOT EXISTS (SELECT * FROM Tab1 AS B WHERE A.SERIAL_NUM = B.SERIAL_NUM AND (B.Attribut = 'G' OR B.Attribut = 'I' OR B.Attribut = 'J' OR B.Attribut ='K'))

                    AND

                    (A.Attribut = 'X' OR A.Attribut = 'Y' )



                    AND A.Zeistempel > '20110705 000000' And Tab2.Produktname = A.Produktname

                    GROUP BY Tab2.Produktname


                    Stimmt dieser so? Danke fürs kontrollieren =)

                    Zum Verständnis:

                    EIne Produktgruppe kann natürlich mehrere Seriennummer haben
                    Zuletzt editiert von harry6233; 19.07.2011, 16:55.

                    Comment


                    • #11
                      Hallo harry6233,

                      du solltest dich bei Gelegenheit beim Rätselverlag um einen Nebenjob erkundigen. Scheinst ein Naturtalent zu sein

                      Falls(!) ich dich richtig verstanden habe, sollte es einfach so funktionieren.

                      PHP Code:
                      SELECT
                           COUNT
                      (DISTINCT SERIAL_NUM)
                          ,
                      Produktname 
                      FROM Tab1
                      WHERE   Produktname NOT IN 
                      (SELECT DISTINCT Produktname FROM Tab1 WHERE Attribut IN ('G''I''J''K'))
                          AND 
                      Produktname     IN (SELECT DISTINCT Produktname FROM Tab1 WHERE Attribut IN ('X''Y'))
                          AND 
                      Zeistempel >= '20110705 000000'
                      GROUP BY Produktname 
                      Und Falk Prüfer sprach: Formatierung von SQL in Beiträgen

                      Comment


                      • #12
                        Hallo!

                        Haha ja danke das könnt ich echt machen =)

                        Danke für deine Hilfe! Ich werde morgen früh gleich mal deinen Ansatz testen und schauen was der für Ergebnisse bringt (vll. bringt er ja die selben wie meiner :P )

                        Aber vom Prinzip her sind unsere Ansätze doch fast gleich oder? Ich meine bei deinem Ansatz, würde da nicht statt Produktname Seriennummer gehören?

                        Ein Produktname hat viele verschiedene Seriennummer:

                        zB.: PC Modell China - SR1, SR2, SR3 usw

                        Ich fasse noch einmal kurz und verständlich zusammen was ich will hehe =)



                        Im Unternehmen werden alle Seriennummern (also Produkte) an verschiedenen Stationen (ca. 10) geloggt. Die Reihenfolge ist meist die selbe. Nennen wir die Stationen A,B,C,D,E,F,G,H (die Stationen sind die Eigenschaften eines Attributtes) usw. ....

                        Ich will die Seriennumern haben die bei Station B oder C geloggt wurden aber nocht nicht bei E oder F oder G oder H geloggt wurden

                        Bsp.: Eine Seriennumer die bei A, B geloggt wurde soll ausgegeben werden
                        Eine Seriennumer die bei B,G geloggt wurde nicht
                        usw ...

                        Zum Schluss soll noch ein Zeitstempel die Abfrage einschränken



                        Code:
                        SELECT COUNT(DISTINCT A.SERIAL_NUM), Tab2.Produktname 
                        
                        FROM Tab1 AS A, Tab2
                        
                        WHERE 
                        
                         NOT EXISTS 
                        
                           (SELECT * FROM Tab1 AS B WHERE A.SERIAL_NUM = B.SERIAL_NUM AND
                           (B.Attribut = 'E' OR B.Attribut = 'F' OR B.Attribut = 'G' OR B.Attribut ='H'))
                        
                         AND
                        
                          (EXISTS(SELECT * FROM Tab1 AS B WHERE A.SERIAL_NUM = B.SERIAL_NUM AND 
                          (B.Attribut = 'A' OR B.Attribut = 'B')))
                        
                         AND 
                        
                           A.Zeistempel > '20110705 000000' And 
                           Tab2.Produktkey= A.Produktkey
                        
                        GROUP BY Tab2.Produktname



                        Verwendet werden zwei Tabellen:

                        Tab1
                        -Zeitstempel
                        -SRN
                        -Attribut
                        -Produktkey

                        Tab2
                        -Produktkey
                        -Produktname


                        Falls unsere Ansätze verschieden sind wäre es toll wenn du mir den Unterschied erklären könntest =)

                        Tausend Dank!

                        LG =) Danke!
                        Zuletzt editiert von harry6233; 20.07.2011, 11:08.

                        Comment

                        Working...
                        X