| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2608 人关注过本帖
标题:求教一段SQL查询语句(列举最后一笔记录)
只看楼主 加入收藏
twy628659
Rank: 1
来 自:美国
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-9-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
求教一段SQL查询语句(列举最后一笔记录)
将二个相同内容的销售表合并,提取其中一个客户所有购买产品的最后(近)记录(如有相同产品,依据"SaleDate"列举最后一笔记录)
表一: SaleTran   表二: SalTranY  内容: CustNO, Item, Description, SaleDate, Qty, Price
假定 CustNO = ABC-CO
我只完成了一半希望熟悉sql语句的朋友来看看, Thanks You
程序代码:
SELECT * FROM salesTran;
          INTO CURSOR a_tran;
          WHERE TRAN(custno) = 'ABC-CO';
UNION;
SELECT * FROM salTranY; 
          WHERE tran(custno) = 'ABC-CO'



[ 本帖最后由 twy628659 于 2010-9-4 09:48 编辑 ]
搜索更多相关主题的帖子: SQL 查询 记录 语句 
2010-09-02 03:09
茵梦湖
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:31
帖 子:545
专家分:2180
注 册:2009-4-25
收藏
得分:5 

看不懂 你想表达的是什么意思~  这类问题是很简单的, 只要你把要求说清楚, 一般一句代码即可~

2010-09-02 15:04
pmc1234
Rank: 5Rank: 5
等 级:职业侠客
帖 子:398
专家分:383
注 册:2010-1-6
收藏
得分:5 
他的意思是不是找出满足条件的最后一条记录啊
2010-09-03 08:39
twy628659
Rank: 1
来 自:美国
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-9-2
收藏
得分:0 
对不起, 我再详细说明一下
这在商业批发行业中非常有用,例如客户一年内经常购买5种产品,对于销售员有时想了解此客户每一种产品的最后交易(日期、价格、品种)
** 加粗是我要的结果,从复产品如(鸡蛋,苹果,桔子)只保留最后成交日期的那笔交易 - 以便观察客户买过什么产品和最后交易内客
謝謝!!
CustNO        Item    Description    SaleDate      Qty    Price
ABC-CO        1001    鸡蛋          2010-01-02     10    3.80
ABC-CO        1001    鸡蛋          2010-03-06    132    3.90
ABC-CO      1001   鸡蛋         2010-04-02   14   4.10
ABC-CO        1002    苹果          2010-04-02     10    10.50
ABC-CO        1004    桔子          2010-06-02     14    15.00
ABC-CO        1004    桔子          2010-07-31     132   14.00
ABC-CO      1004   桔子         2010-08-15   17    10.50
ABC-CO      1002   苹果         2010-07-02   10    9.00
ABC-CO      1005   蔬菜         2010-08-15    3     10.50
ABC-CO      1006   籽油         2010-07-02    5     9.00

希望学习以下这一段全用SQL语句来表示

程序代码:
SELECT * FROM salesTran;
          INTO CURSOR a_tran;
          WHERE TRAN(custno) = 'ABC-CO';
          ORDER BY item, saledate DESCENDING
UNION;
SELECT * FROM salTranY;
          WHERE tran(custno) = 'ABC-CO'

** Remove same item duplicates record ORDER BY DESCENDING saledate
SELECT a_tran
DO WHILE .T.

 m.item = item
   SKIP
   IF EOF()
    EXIT
   ENDIF
   DO WHILE item = m.item
        DELETE
    SKIP
   ENDDO   
ENDDO

** Remove DELETE record
SELECT * FROM a_tran;
INTO CURSOR answer;
WHERE .not. DELETE()





[ 本帖最后由 twy628659 于 2010-9-4 09:50 编辑 ]
2010-09-03 12:28
hgfeng1984
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:139
专家分:513
注 册:2006-3-26
收藏
得分:10 
SELECT DISTINCT A.* FROM #TEMP A
INNER JOIN
(SELECT CUSTNO,ITEM,MAX(SALEDATE) AS SALEDATE FROM #TEMP GROUP BY CUSTNO,ITEM) B
ON A.CUSTNO=B.CUSTNO AND A.ITEM=B.ITEM AND A.SALEDATE=B.SALEDATE
2010-09-03 21:33
twy628659
Rank: 1
来 自:美国
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-9-2
收藏
得分:0 
以下是引用hgfeng1984在2010-9-3 21:33:29的发言:

SELECT DISTINCT A.* FROM #TEMP A
INNER JOIN
(SELECT CUSTNO,ITEM,MAX(SALEDATE) AS SALEDATE FROM #TEMP GROUP BY CUSTNO,ITEM) B
ON A.CUSTNO=B.CUSTNO AND A.ITEM=B.ITEM AND A.SALEDATE=B.SALEDATE
Hi hgfeng1984:  SYNTAX ERROR

受你的MAX()启发虽然我无法实现一行代码,但比起用DO WHILE ....还是强了不少,谢谢!
为了使所有看帖的人都受益,特附送artran98.dbf , arytrn98.dbf 有兴趣的朋友可以自已动手试试,最好可以实现一行代码,大家共同学习
程序代码:
CLOSE ALL
USE C:\temp\artran98.dbf IN 0 SHARED
USE C:\temp\arytrn98.dbf IN 0 SHARED

** Single Customer MAX(invdte) history sales
SELECT * FROM artran98;
          INTO CURSOR a_tran;
          WHERE TRAN(custno) = '65RTON';
UNION;
SELECT * FROM arytrn98;
          WHERE tran(custno) = '65RTON'
** Remove same item duplicates record ORDER BY Invdte
SELECT MAX(INVDTE) AS Invoice_Date,Invno,Custno,Item,Descrip,Cost,Price Qtyord,Qtyshp;
INTO CURSOR answer;
FROM a_tran GROUP BY item;
ORDER BY item
SELECT answer
BROWSE

** All Customer MAX(invdte) history sales
SELECT * FROM artran98;
          INTO CURSOR a_tran2;
UNION;
SELECT * FROM arytrn98
** Remove same item duplicates record ORDER BY Invdte
SELECT MAX(INVDTE) AS Invoice_Date,Invno,Custno,Item,Descrip,Cost,Price Qtyord,Qtyshp;
INTO CURSOR answer2;
FROM a_tran2 GROUP BY custno,item;
ORDER BY custno,item
SELECT answer2
BROWSE

tables.rar (70.37 KB)



[ 本帖最后由 twy628659 于 2010-9-4 11:22 编辑 ]
2010-09-04 11:12
hgfeng1984
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:139
专家分:513
注 册:2006-3-26
收藏
得分:0 
我是在查询分析器里写的,#TEMP是临时表.你把#去掉就可以了.就是个思路.
2010-09-04 11:49
twy628659
Rank: 1
来 自:美国
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-9-2
收藏
得分:0 
SELECT DISTINCT A.* FROM a_tran A;
INNER JOIN;
(SELECT CUSTNO,ITEM,MAX(invdte) AS SALEDATE FROM a_tran GROUP BY CUSTNO,ITEM) B;
ON A.CUSTNO=B.CUSTNO AND A.ITEM=B.ITEM AND A.invdte=B.invdte
a_tran=2表合并后的临时表, SYNTAX ERROR on this: (SELECT CUSTNO,ITEM,MAX(invdte) AS SALEDATE FROM a_tran GROUP BY CUSTNO,ITEM) B;
如果你方便的话,利用我给大家的tables做一个完整也好方便大家学习, 再次感谢你的回复
2010-09-04 12:24
hgfeng1984
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:139
专家分:513
注 册:2006-3-26
收藏
得分:0 
你上面这样错在 A.invdte=B.invdte,因为B表里只有SALEDATE字段( MAX(invdte) AS SALEDATE ).
可以改为A.invdte=B.SALEDATE,也可以改AS后的字段名.

还有INNER JOIN 的方式可以改用EXISTS来处理,速度上有所提高.类似(ARTRAN_CRU为UNION后的临时表):
Select Distinct A.* From ARTRAN_CRU A;
    WHERE EXISTS;
    (SELECT 1 FROM (Select CUSTNO,Item,Max(invdte) As invdte From ARTRAN_CRU Group By CUSTNO,Item) B;
    where A.CUSTNO=B.CUSTNO And A.Item=B.Item And A.invdte=B.invdte) INTO CURSOR tmp2


[ 本帖最后由 hgfeng1984 于 2010-9-4 13:49 编辑 ]
2010-09-04 13:48
快速回复:求教一段SQL查询语句(列举最后一笔记录)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014361 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved