2009-06-18 6 views
1

Bitte helfen Sie !! Ich bin brandneu in SQL-Programmierung und lehre mich alles, während ich mitfahre. Ich bin endlich auf ein Problem gestoßen, das ich nicht angehen kann. Hoffentlich kann jemand helfen. Ich habe die folgenden Tabellen. Was ich tun muss, ist das RECDATE in FROISEDI zu verwenden und alle unterschiedlichen Daten (I4C7DZ) vor und einschließlich dieses Datums in WEI4CPP zu zählen. Ich habe den Code unten verwendet und es scheint zu funktionieren, bis ich einen Datensatz habe, der den gleichen CACLAIM-Wert hat. Ich habe auch Fälle, in denen zwei Datensätze die gleiche CACLAIM und DOI haben, so dass mein Code dann auch nicht funktioniert. Irgendwie muss ich AGCLAIM von FROISEDI verwenden, aber ich weiß nicht, wie man es in meine Zählertabelle zieht. Oh, und ich benutze SAS, also ist es nicht genau SQL aber wirklich nah. Danke für jede Hilfe!Hilfe mit korrelierten Abfragen in SQL


TABLE: FROISEDI 
AGCLAIM RECDATE CACLAIM  DOI 
09073589 1/29/09 09 41615 1/28/09 
09115390 3/01/09 00012HR09 2/23/09 
09234567 4/20/09 003140010 1/2/09 
09154826 5/01/09 003140010 4/28/09 

TABLE: WEI4CPP 
I4C7DZ  I4X6TX  I4YWTX I4YFTX 
1/28/09    1/28/09 09 41615 
1/29/09 09073589 1/28/09 09 41615 
1/30/09 09073589 1/28/09 09 41615 
2/24/09    2/23/09 00012HR09 
2/28/09    2/23/09 00012HR09  
3/01/09 09115390 2/23/09 00012HR09 
3/15/09 09115390 2/23/09 00012HR09 
1/15/09    1/02/09 003140010 
1/20/09    1/02/09 003140010 
2/08/09    1/02/09 003140010 
3/19/09    1/02/09 003140010 
4/20/09 09234567 1/02/09 003140010 
5/01/09 09154826 4/28/09 003140010 

TABLE I NEED TO PRODUCE: COUNTS 
AGCLAIM  CACLAIM DOI  SUBMITS 
09073589 09 41615  1/28/09 2 
09115390 00012HR09 2/23/09 3 
09234567 003140010 1/02/09 5 
09154826 003140010 4/28/09 1 

CODE ich verwendet habe:

PROC SQL; 
CREATE TABLE COUNTS AS 
SELECT I4YWTX AS DOI3, 
I4YFTX AS CLMNUM2, 
COUNT(DISTINCT I4C7DZ) AS SUBMITS 
FROM WAREHOUS.WEI4CPP A 
WHERE I4C7DZ<=(SELECT RECDATE 
     FROM FROISEDI 
     WHERE FROISEDI.CACLAIM=A.I4YFTX 
     AND FROISEDI.DOI=A.I4YWTX) 
GROUP BY WEI4CPP.I4YFTX, WEI4CPP.I4YWTX; 
QUIT; 
+0

Woher wissen Sie, dass diese 4 Zeilen mit einem Leerzeichen I4X6TX unmittelbar vor 09234567 zu 09234567 gehören? – longneck

+0

WEI4CPP enthält viel mehr Felder als die, die ich zeigte. Jeder Datensatz basiert auf einer Übermittlung an unsere Abteilung, und bis alle Einträge im Datensatz korrekt sind, akzeptieren wir die Einreichung nicht und weisen eine Agenturanspruchsnummer (I4X6TX) zu. Der Datensatz mit der Agenturanspruchsnummer ist der erste Datensatz, den wir akzeptiert haben. Ich versuche zu zählen, wie oft sie eingereicht haben, bevor wir sie angenommen haben. FROISEDI sind alle eindeutigen Aufzeichnungen, die wir akzeptiert haben. –

+0

Wiederholen Sie die Frage von # @ longneck: Wie können Sie sagen, dass die 4 Zeilen in WEI4CPP mit I4YFTX = "003140010" AGCLAIM = "09234567" und nicht mit AGCLAIM = "09154826" zugeordnet sind? Da diese beiden AGCLAIM-Werte mit CACLAIM = "003140010" verknüpft sind, gibt es keine offensichtliche Möglichkeit, zu sagen, dass die WEI4CPP-Zeilen ohne I4XCTX-Wert zu beiden Ansprüchen gehören ... Auch die Namen der Spalten und Tabellen sind so schrecklich wie sie war immer mein Unmut zu lesen - sie machen es definitiv schwieriger, die Frage zu verstehen. –

Antwort

1

Hat es nicht testen. versuchen, diese

SELECT 
    AGCLAIM, 
    CACLAIM,  
    DOI, T.cnt + 1 AS SUBMITS 
FROM 
    FROISEDI 
    INNER JOIN 
    (
    SELECT 
     COUNT(*) cnt, 
     I4YFTX , 
      I4YWTX  
    FROM 
     WEI4CPP 
    WHERE 
     ISNULL(I4X6TX,0) = 0 
    GROUP BY 
     I4YFTX, I4YWTX  
    ) T 
    ON FROISEDI.CACLAIM = T.I4YFTX 
+0

Funktioniert das, wenn ich Instanzen wie die letzten zwei in meinem obigen Beispiel habe, wo sie das gleiche CACLAIM (alias I4YFTX) aber verschiedene DOIs (I4YWTX) haben? Und was ist, wenn sie die gleiche CACLAIM und DOI haben und die einzige Sache, die sie unterscheidet, ist die AGCLAIM, die nicht in jedem Datensatz in WEI4CPP ist? –

+0

Ich denke, Sie Cloud-Condition hinzufügen. Ich werde es überprüfen und aktualisieren. – THEn

+0

Die Frage ist, wenn I4X6TX leer ist, woher weißt du, welchem ​​es gehört? – THEn

0

Ich habe nicht durch die Logik im Detail gegangen, aber stellen Sie sicher, dass beide Daten als numerische Werte gespeichert werden. Ich habe mehr als einmal ein Datum gesehen, das als Char gespeichert wurde, also funktionieren GT und LT nicht so, wie du denkst.

0

Es sieht so aus, als ob der WEI4CPP.I4YFTX der Verbindungswert FROISEDI.CACLAIM ist und WEI4CPP.I4YWTX FROISEDI.DOI ist. Ist es so einfach?

SELECT fr.AGCLAIM, fr.CACLAIM, fr.DOI, COUNT(we.I4C7DZ) as SUBMITS 
FROM FROISEDI fr 
     INNER JOIN WEI4CPP we 
      ON we.I4YFTX = fr.CACLAIM 
      AND  we.I4YWTX = fr.DOI 
      AND  ISNULL(we.I4X6TX, fr.AGCLAIM) = fr.AGCLAIM 
WHERE we.I4C7DZ <= fr.RECDATE 
GROUP BY fr.AGCLAIM, fr.CACLAIM, fr.DOI 

Hinweis wird es ein Problem mit diesem, wenn Reihen die gleiche DOI und CACLAIM haben, aber die WEI4CPP.I4X6TX Spalte ist leer. In diesem Fall kenne ich Ihre Geschäftsregeln zur Auflösung der AGCLAIM nicht. Ich kann sie ablehnen, wenn sie ausgefüllt sind und nicht übereinstimmen, aber ich würde irgendeine Art von datumbezogenen oder anderen Informationen benötigen, um sie anderen zu entsprechen.