帮助SQL中的相关查询

时间:2009-06-18 18:01:26

标签: sql subquery sas proc-sql

请帮忙!!我是SQL编程的全新人,我正在教我自己的一切。我终于遇到了一个我似乎无法解决的问题。希望有人可以提供帮助。我有以下表格。我需要做的是使用FROISEDI中的RECDATE并在WEI4CPP中计算该日期之前和之后的所有不同日期(I4C7DZ)。我已经使用了下面的代码,它似乎工作,直到我有一个具有相同CACLAIM值的记录。我也有两个记录具有相同CACLAIM和DOI的实例,因此我的代码也不起作用。不知何故,我需要使用FROISEDI的AGCLAIM,但我不知道如何将它拉入我的Counts表。哦,我正在使用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 个答案:

答案 0 :(得分:1)

没试过。 试试这个

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

答案 1 :(得分:0)

我没有详细介绍你的逻辑,但要确保两个日期都存储为数值。我不止一次看到存储为char的日期,因此GT和LT不会按照你的想法工作。

答案 2 :(得分:0)

看起来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的业务规则。如果他们被填写并且不匹配,我可以拒绝他们,但我需要某种与日期相关或其他信息来匹配他们。