Помощь с коррелированными запросами в SQL - PullRequest
1 голос
/ 18 июня 2009

Пожалуйста, помогите! Я новичок в программировании на SQL и учу себя всему на ходу. Я наконец-то столкнулся с проблемой, которую, похоже, не могу решить. Надеюсь, кто-то может помочь. У меня есть следующие таблицы. Что мне нужно сделать, это использовать RECDATE в FROISEDI и подсчитать все различные даты (I4C7DZ) до и включая эту дату в WEI4CPP. Я использовал приведенный ниже код, и он работает, пока у меня не будет записи с таким же значением CACLAIM. У меня также есть случаи, когда две записи имеют одинаковые CACLAIM и DOI, поэтому мой код тоже не работает. Каким-то образом мне нужно использовать AGCLAIM от FROISEDI, но я не знаю, как вытащить его в свою таблицу показателей. О, и я использую SAS, так что это не совсем 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  

код, который я использовал:

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;

Ответы [ 3 ]

1 голос
/ 18 июня 2009

Не проверял. попробуйте это

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 голосов
/ 23 июня 2009

Похоже, что WEI4CPP.I4YFTX является значением связывания FROISEDI.CACLAIM, а WEI4CPP.I4YWTX - FROISEDI.DOI. Это так просто?

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

Обратите внимание, что возникнет проблема с этим, если строки имеют одинаковые DOI и CACLAIM, но столбец WEI4CPP.I4X6TX пуст. В этом случае я не знаю ваших бизнес-правил, касающихся решения, к какому AGCLAIM они относятся. Я могу отклонить их, если они заполнены и не совпадают, но мне потребуется какая-либо информация, связанная с датой, или другая информация, чтобы сопоставить их в противном случае.

0 голосов
/ 19 июня 2009

Я не подробно рассмотрел вашу логику, но убедитесь, что обе даты хранятся в виде числовых значений Я не раз видел дату, хранящуюся в виде символа, поэтому GT и LT не работают так, как вы думаете.

...