SQL如何筛选出客户最后一次购买商品记录

表XSCK_HBILLNONO(单号)date(日期)ClntCode(客户代码)ClntName(客户名称)XSCK00012012-02-05001张三XSCK000... 表XSCK_H
BILLNONO(单号) date(日期) ClntCode(客户代码) ClntName(客户名称)
XSCK0001 2012-02-05 001 张三
XSCK0002 2012-02-05 002 李四
XSCK0003 2012-02-10 002 李四
XSCK0004 2012-02-10 001 张三

表XSCK_B
BILLNONO(单号) GoodCode(商品代码) GoodName(商品名称) Quat(数量) Price(价格)
XSCK0001 PG0001 苹果 100 1.5
XSCK0001 XJ0001 香蕉 50 2.0
XSCK0001 HMG001 哈密瓜 10 5.5
XSCK0002 MG0001 芒果 25 3.2
XSCK0002 HMG001 哈密瓜 8 5.5
XSCK0003 PG0001 苹果 150 1.6
XSCK0003 HMG001 哈密瓜 8 5.5
XSCK0004 PG0001 苹果 20 1.8
XSCK0004 XJ0001 香蕉 30 2.1

要得出的结果为
BILLNONO(单号) date(日期) ClntCode(客户代码) ClntName(客户名称) GoodCode(商品代码) GoodName(商品名称) Quat(数量) Price(价格)
XSCK0004 2012-02-10 001 张三 PG0001 苹果 20 1.8
XSCK0004 2012-02-10 001 张三 XJ0001 香蕉 30 2.1
XSCK0001 2012-02-05 001 张三 HMG001 哈密瓜 10 5.5
XSCK0003 2012-02-10 002 李四 PG0001 苹果 150 1.6
XSCK0003 2012-02-10 002 李四 HMG001 哈密瓜 8 5.5
XSCK0002 2012-02-05 002 李四 MG0001 芒果 25 3.2
展开
 我来答
du瓶邪
推荐于2016-06-18 · TA获得超过2.4万个赞
知道大有可为答主
回答量:1.7万
采纳率:100%
帮助的人:2938万
展开全部

范例如下:

--> 测试数据:[XSCK_H]
if object_id('[XSCK_H]') is not null 
drop table [XSCK_H]
create table [XSCK_H](
[BILLNONO] varchar(8),
[date] datetime,
[ClntCode] varchar(3),
[ClntName] varchar(4)
)
insert [XSCK_H]
select 'XSCK0001','2012-02-05','001','张三' union all
select 'XSCK0002','2012-02-05','002','李四' union all
select 'XSCK0003','2012-02-10','002','李四' union all
select 'XSCK0004','2012-02-10','001','张三'
 
--> 测试数据:[XSCK_B]
if object_id('[XSCK_B]') is not null 
drop table [XSCK_B]
create table [XSCK_B](
[BILLNONO] varchar(8),
[GoodCode] varchar(6),
[GoodName] varchar(6),
[Quat] int,
[Price] numeric(2,1)
)
insert [XSCK_B]
select 'XSCK0001','PG0001','苹果',100,1.5 union all
select 'XSCK0001','XJ0001','香蕉',50,2.0 union all
select 'XSCK0001','HMG001','哈密瓜',10,5.5 union all
select 'XSCK0002','MG0001','芒果',25,3.2 union all
select 'XSCK0002','HMG001','哈密瓜',8,5.5 union all
select 'XSCK0003','PG0001','苹果',150,1.6 union all
select 'XSCK0003','HMG001','哈密瓜',8,5.5 union all
select 'XSCK0004','PG0001','苹果',20,1.8 union all
select 'XSCK0004','XJ0001','香蕉',30,2.1 
 
select 
      BILLNONO,[date],ClntCode,ClntName,GoodCode,GoodName,Quat,Price
from
     (
select 
      id=row_number()over(partition by [ClntName],[GoodName] order by [date] desc),
      a.*,b.GoodCode,b.GoodName,b.Quat,b.Price
from  
    [XSCK_H] a 
full join 
    [XSCK_B] b 
on 
    a.BILLNONO=b.BILLNONO
    )t
where 
    id=1
order by 
    ClntCode
/*
BILLNONO    date    ClntCode    ClntName    GoodCode    GoodName    Quat    Price
XSCK0001    2012-02-05 00:00:00.000    001    张三    HMG001    哈密瓜    10    5.5
XSCK0004    2012-02-10 00:00:00.000    001    张三    PG0001    苹果    20    1.8
XSCK0004    2012-02-10 00:00:00.000    001    张三    XJ0001    香蕉    30    2.1
XSCK0003    2012-02-10 00:00:00.000    002    李四    HMG001    哈密瓜    8    5.5
XSCK0002    2012-02-05 00:00:00.000    002    李四    MG0001    芒果    25    3.2
XSCK0003    2012-02-10 00:00:00.000    002    李四    PG0001    苹果    150    1.6
*/
壹寰(深圳)科技文化有限公司
2021-03-27 广告
要找正规专业的公司,行业口碑也比较重要。如果想了解更多详细信息,可以咨询下壹寰(深圳)科技文化有限公司。91数据恢复是壹寰(深圳)科技文化有限公司旗下专业数据恢复品牌,91数据恢复专注于勒索病毒数据恢复、勒索病毒数据修复、数据库修复、数据库... 点击进入详情页
本回答由壹寰(深圳)科技文化有限公司提供
wangzhiqing999
推荐于2016-05-23 · TA获得超过1.6万个赞
知道大有可为答主
回答量:7048
采纳率:100%
帮助的人:3345万
展开全部
CREATE TABLE XSCK_H (
BILLNONO varchar(10),
hdate varchar(10),
ClntCode varchar(10),
ClntName varchar(10)
)
GO

INSERT INTO XSCK_H
SELECT 'XSCK0001', '2012-02-05', '001', '张三' UNION ALL
SELECT 'XSCK0002', '2012-02-05', '002', '李四' UNION ALL
SELECT 'XSCK0003', '2012-02-10', '002', '李四' UNION ALL
SELECT 'XSCK0004', '2012-02-10', '001', '张三'
GO

CREATE TABLE XSCK_B (
BILLNONO varchar(10),
GoodCode varchar(10),
GoodName varchar(10),
Quat int,
Price decimal(5,2)
)
GO

INSERT INTO XSCK_B
SELECT 'XSCK0001', 'PG0001', '苹果', 100 , 1.5 UNION ALL
SELECT 'XSCK0001', 'XJ0001', '香蕉', 50 , 2.0 UNION ALL
SELECT 'XSCK0001', 'HMG001', '哈密瓜', 10 , 5.5 UNION ALL
SELECT 'XSCK0002', 'MG0001', '芒果', 25 , 3.2 UNION ALL
SELECT 'XSCK0002', 'HMG001', '哈密瓜', 8 , 5.5 UNION ALL
SELECT 'XSCK0003', 'PG0001', '苹果', 150 , 1.6 UNION ALL
SELECT 'XSCK0003', 'HMG001', '哈密瓜', 8 , 5.5 UNION ALL
SELECT 'XSCK0004', 'PG0001', '苹果', 20 , 1.8 UNION ALL
SELECT 'XSCK0004', 'XJ0001', '香蕉', 30 , 2.1
GO

With MyCTE AS (
SELECT
XSCK_H.BILLNONO,
XSCK_H.hdate,
XSCK_H.ClntCode,
XSCK_H.ClntName,
XSCK_B.GoodCode,
XSCK_B.GoodName,
XSCK_B.Quat,
XSCK_B.Price
FROM
XSCK_H JOIN XSCK_B
ON (XSCK_H.BILLNONO = XSCK_B.BILLNONO)
)
SELECT * FROM MyCTE
WHERE
NOT EXISTS (
SELECT 1
FROM MyCTE newest
WHERE
MyCTE.ClntCode = newest.ClntCode
AND MyCTE.GoodCode = newest.GoodCode
AND MyCTE.hdate < newest.hdate
)
ORDER BY
ClntCode,
hdate DESC

BILLNONO hdate ClntCode ClntName GoodCode GoodName Quat Price
---------- ---------- ---------- ---------- ---------- ---------- ----------- ---------------------------------------
XSCK0004 2012-02-10 001 张三 PG0001 苹果 20 1.80
XSCK0004 2012-02-10 001 张三 XJ0001 香蕉 30 2.10
XSCK0001 2012-02-05 001 张三 HMG001 哈密瓜 10 5.50
XSCK0003 2012-02-10 002 李四 PG0001 苹果 150 1.60
XSCK0003 2012-02-10 002 李四 HMG001 哈密瓜 8 5.50
XSCK0002 2012-02-05 002 李四 MG0001 芒果 25 3.20

(6 行受影响)

SQL Server 2008 下测试通过
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式