yihuizeng 发表于 2007-3-22 19:13

PB的data window的SQL问题, 如何才可以选择一个栏位两次?

SELECT LCAAPRC.CLMNUM,   <BR>         LCAAPRC.SUBMITDTE,   <BR>         LCAAPRC.SURNAME,     <BR>         LCAAPRC.ASSESSOR,     <BR>         (select LCALPF.PNDATE from LCALPF where <BR>         LCALPF.PNCODE like 'I%'),<BR>         (select LCALPF.PNDATE from LCALPF where <BR>         LCALPF.PNCODE like 'Q%'),  <BR>         (select LCALPF.reslvdte from LCALPF where<BR>         LCALPF.reslvcde &lt;&gt; '')<BR>    FROM LCAAPRC,LCALPF<BR><BR>从这个SQL里面大家可以看到我一共提取了LCALPF.PNDATE这条数据两次, 不过是根据两条不同的where条件语句. 我的目的是提取PNDATE这个字段分别在LCALPF.PNCODE的开头字母是I 和 Q的时候, 如果按照我现在的SQL会出现我提取了多余一条数据的警告, 导致数据提取失败, 请问各位高人, 要如何才可以做得到呢??<BR><BR>谢谢[em01][em01]

路過 发表于 2007-3-23 09:31

回复:(yihuizeng)PB的data window的SQL问题, 如何才...

SELECT A.SEQ,B.SEQ<BR> FROM (SELECT TOPIC,SEQ FROM HELP WHERE SEQ LIKE '1%') A,<BR>      (SELECT TOPIC,SEQ FROM HELP WHERE SEQ LIKE '2%') B<BR>  WHERE  A.TOPIC = B.TOPIC ;<BR>顯示兩個欄位。topic是主健。<BR>你那裡都沒有where條件<BR>        

yihuizeng 发表于 2007-3-23 10:15

有一个问题, 我试过照你的sql来改我的语句, 不过<BR><BR>FROM (SELECT TOPIC,SEQ FROM HELP WHERE SEQ LIKE '1%') A,<BR>      (SELECT TOPIC,SEQ FROM HELP WHERE SEQ LIKE '2%') B<BR>  WHERE  A.TOPIC = B.TOPIC ;<BR><BR>这一段, 在我的语句中, 例如, 我只需要选择SEQ而不需要选择Topic的, 所以我把他改变成: FROM (SELECT SEQ FROM HELP WHERE SEQ LIKE '1%') A,<BR>      (SELECT SEQ FROM HELP WHERE SEQ LIKE '2%') B<BR>  WHERE  A.TOPIC = B.TOPIC ;<BR>这样子就会显示说 topic not in table A in *N.<BR>请问这样的情况要怎么解决? 谢谢<BR><BR>

路過 发表于 2007-3-23 14:02

裡面的TOPIC就是關聯用的呀當然是要的<BR>(SELECT SEQ FROM HELP WHERE SEQ LIKE '2%') B<BR>把TOPIC加進去就好啦,<BR>打個比方:<BR>我不知道LCAAPRC,LCALPF之間的關系,我現在假設欄位SUBMITDTE是兩個表的主健,以這個欄位相聯<BR>就可以這個寫:<BR><BR>SELECT LCAAPRC.CLMNUM,   <BR>         LCAAPRC.SUBMITDTE,   <BR>         LCAAPRC.SURNAME,     <BR>         LCAAPRC.ASSESSOR,     <BR>         A.PNDATE,<BR>         B.PNDATE,<BR>         LCALPF.reslvdte <BR>   FROM LCAAPRC,LCALPF,<BR>    (select SUBMITDTE,PNDATE from LCALPF where <BR>         LCALPF.PNCODE like 'I%') A,<BR>    (select SUBMITDTE,PNDATE from LCALPF where <BR>         LCALPF.PNCODE like 'Q%') B <BR>WHERE LCAAPRC.SUBMITDTE = A.SUBMITDTE AND<BR>      LCAAPRC.SUBMITDTE = B.SUBMITDTE AND<BR>      LCAAPRC.SUBMITDTE = LCALPF.SUBMITDTE AND<BR>      LCALPF.reslvcde &lt;&gt; ''<BR><BR><BR>

yihuizeng 发表于 2007-3-23 14:17

LCALPF里面有三个主键, 分别是CLMNUM, CHDRNUM, PNCODE, 那需要把这三个都加进去吗? 那这个SQL语句不是变得非常庞大了吗?? 谢谢

notbig 发表于 2007-3-23 14:56

<P>楼主写法不正确<BR>因为你SELECT每条记录却单个字段却是个多记录的集合<BR>我不清楚楼主想要取什么数据。</P>

yihuizeng 发表于 2007-3-23 15:10

不好意思,可能写得太混乱了吧, 我再说明一下, 我是想从LCALPF中提取一个叫PNDATE(照会日期)的字段. 不过我想通过两种不同的过滤条件来提取, 一个是当PNCODE(照会代码)的开头第一个字母是等于I时提取的PNDATE. 另外一个是当PNCODE(照会代码)的开头第一个字母是等于Q时提取的PNDATE. LCALPF这个table一共有三个primary key, 分别是, chdrnum, clmnum和pncode, 按照这个思路的sql应该怎么写呢? 谢谢

路過 发表于 2007-3-23 17:39

<P>你可以按照上面的方法自已試一下嗎?看一下數據拉出是不是對的。<BR></P>

yihuizeng 发表于 2007-3-23 22:50

我是想按照来做, 不过照你的方法, LCALPF里面有三个主键呢, 我需要除了PNDATE其他三个主键都全部要选择的话, 我的SQL语句会变得非常大, 这样提取数据的速度会降低而且我怕PB也跑不起太复杂的语句<br><br>谢谢<br>

notbig 发表于 2007-3-24 22:46

select pndate from table where pncode like 'i%' or pncode like 'q%'

yihuizeng 发表于 2007-3-25 23:54

我觉得斑竹可能有点误会, 我再次澄清一下。 首先我需要两个栏位: 会签日期和调查日期。 这两个栏位是都需要在data window上显示出来的。 分别是两个不同的栏位来的。会签是选择PNDATE当pncode是开头是i的数据,调查是选择PNDATE当pncode是开头是q的数据。 按照您的做法, 似乎只是一个拦位按照不同的条件选择不同的数据, 也就是一个pndate栏位,他可以有pncode like %i 或者 pncode like q%两条过滤条件. 这跟我的要求有些不同吧<br>

notbig 发表于 2007-3-26 08:45

<P>你是一个表还是两个表<BR>你可以列出主要表的主要字段及相关数据,达到目的的数据显示参考。<BR></P>

yihuizeng 发表于 2007-3-27 10:12

好的好的, 这个表其实是提取不同类型照会的日期的表格. 是一个表里面有这四个栏位,分别是:<BR><BR><BR>号码(num)       签核日期(qdate)         调查日期(cdate)         核销日期(sdate)<BR><BR>qdate其实是后台 'LCALPF' 表中里的pndate(照会日期)在pncode(照会码)等于I****的时候, 这样的照会被定义成送签核照会, 所以这个时候的pndate(照会日期)就是被定义为签核日期了<BR><BR>cdate则是后台里的'LCALPF'表中的pndate(照会日期)在pncode(照会码)等于Q****的时候,这样的照会就被定义为调查照会,所以这个时候的pndate(照会日期)就被定义为签核日期了<BR><BR>sdate则是后台里的'LCALPF'表中的reslvdte(解决日期)在reslvcode(解决码)不为空值的时候, 这样代表这条照会已经有了解决方法了, 这时候reslvdte就可以并定义为核销日期了.<BR><BR>他们都是在同一个表LCALPF中提取的, 麻烦的是qdate和cdate, select的都是pndate.我不知道怎么做才行??<BR><BR><BR>

notbig 发表于 2007-3-27 13:34

<P>那么LCALPF表的结构呢?<BR></P>

notbig 发表于 2007-3-27 13:36

假设一个NUM记录它在LCALPF表中的记录是什么样?<BR>它在LCALPF表中是不是一条记录还是多条记录<BR>这些都没有交待的?<BR>

notbig 发表于 2007-3-27 13:38

<P>再问一下,如果一条NUM在LCALPF表中是多条记录,那么是不是当PCODE为I字头时的记录只有一条还是多条,如果是多条应该取哪条,同样的就是当为Q字头时又是如何</P>

yihuizeng 发表于 2007-3-27 17:39

<P>您的意思是以上那些字段在LCALPF的数据结构吗? <BR><BR>pncode: char(5),       例子Q20035或者 I1000<BR>num: char(9),        例子:700000769<BR>pndate: decimal(0),    例子:20070206<BR>reslvcode: char(5)     例子:R2111<BR>reslvdte: decimal(0),  例子:20070312<BR><BR>请问这些资料是不是你需要的?</P>

notbig 发表于 2007-3-28 08:26

这些是需要的,还有就是70000769 在PNCODE的字头为Q时是只会有一条记录还是会有多条<BR>如按上表记录会不会是这样<BR>q20035 70000769  20070206  R2111 20070312<BR>i1000  70000769  20070306  R2111 20070312<BR><BR>还是70000769 只会有一条记录,只是PNCODE的值可能是Q字头也可能是I字头<BR><BR>

notbig 发表于 2007-3-28 08:27

楼主可以罗列一些数据出来

yihuizeng 发表于 2007-3-28 16:39

<DIV class=quote><B>以下是引用<U>notbig</U>在2007-3-28 8:26:38的发言:</B><BR>这些是需要的,还有就是70000769 在PNCODE的字头为Q时是只会有一条记录还是会有多条<BR>如按上表记录会不会是这样<BR>q20035 70000769  20070206  R2111 20070312<BR>i1000  70000769  20070306  R2111 20070312<BR><BR>还是70000769 只会有一条记录,只是PNCODE的值可能是Q字头也可能是I字头<BR><BR></DIV>
<P>
<P><BR><BR>其实我说漏了点东西, 需要查找的分别是‘最小送签核照会日期’和‘最小调查照会日期’<BR>也就是照会码(pncode)开头为Q或者I所相对应的最小的照会日期(pndate)<BR>以及最大解决日期(rslvdate)</P>
<P>用7000769去查询pncode开头为Q后者I的PNDATE的时候会出现多条记录,因为对应这个号码可能<BR>出现多条照会, 同样每条照会都需要一个解决码才确定这条照会已经解决, 如果解决码是空则<BR>代表并无解决。解决码,解决日期并不影响会签和调查日期</P>
<P> <BR>例如会出现以下的情况</P>
<P>PNCODE    NUM        PNDATE    Rslvcode     Rslvdate</P>
<P>q200035   70000769   20060203  T10000        20071120  <BR>q100000   70000769   20070103  T20000         20050303<BR>i501230   70000769   20070505  <BR>i102123   70000769   20070101  T51431        20060805<BR>q938100   70000769   20051022  T32123        20080909</P>
<P>从这个照会提取出来的数据可以看得到, 用70000769可以查出三条Q开头的pncode和两条I开头的pncode<BR>他们分别对应的是不同的日期, 而rslvcode和rslvdate就只有一条<BR>意思是在日期20060203 这个号码70000769有一条送签核的照会<BR>      在日期20060103 这个号码70000769有一条送签核的照会<BR>      在日期20051022 这个号码70000769有一条送签核的照会</P>
<P>      在日期20070103 这个号码70000769有一条调查的照会<BR>      在日期20070101 这个号码70000769有一条调查的照会</P>
<P>      q200035这条签核照会在20071120这个时间以T10000的解决方式解决了<BR>      q100000这条签核照会在20050303这个时间以T20000的解决方式解决了<BR>      q938100这条签核照会在20080909这个时间以T32123的解决方式解决了<BR>      i501230这条调查照会并没有响应的解决码,解决日期也为空,代表为解决(当解决码为空值,解决日期必然也为空)<BR>      i102123这条调查照会在20060805这个时间以T51431的解决方式解决了<BR>      </P>
<P>我的SQL的目的是可以分别提取出三个栏位:最小的签核照会日期, 最小的调查照会日期和最大解决日期<BR>也就是带出<BR> QHDATE                      DCDATE                   JJDATE<BR>20050303(最小签核日期), 200060805(最小调查日期)和 20080808(最大解决日期)</P>

页: [1] 2

编程论坛