none
请教T-SQL代码 RRS feed

  • 问题

  • 第一个用户资料表:T1

    GuestID      GuestName

    1                张三

    2                李四

    3               王二

    第二个用户执卡表:T2

    GusetID     CardCode

    1                001

    2                002

    第三个用户消费表:T3

    CardCode        consume      Date

    001                   20        2012-03-20

    001                  33         2012-03-21

    002                40           2012-04-02

    001               50           2012-06-01

    002                15          2012-07-08

    需要查询全部用户ID、用户名称、卡号、最后一次消费日期及消费金额

    就是要得到这个:

    GuestID     GuestName    CardCode   Date             consume

    1                张三              001         2012-06-01     50

    2                李四             002          2012-07-08     15

    3               王二              null            null               null


    • 已编辑 管子 2012年11月15日 13:09
    2012年11月15日 13:08

答案

  • 写法很多种,下列为其中一种可能的方式,希望对你有帮助。

    use tempdb
    go
    
    if object_id('t1') is not null
    	drop table t1
    go
    
    create table t1
    (
    	GuestID int,
    	GuestName nvarchar(5)
    )
    go
    
    insert into t1 values (1,'aaa'),(2,'bbb'),(3,'ccc')
    go
    
    if object_id('t2') is not null
    	drop table t2
    go
    
    create table t2
    (
    	GuestID int,
    	CardCode char(3)
    )
    go
    
    insert into t2 values (1,'001'),(2,'002')
    go
    
    if object_id('t3') is not null
    	drop table t3
    go
    
    create table t3
    (
    	CardNo char(3),
    	Consume	int,
    	[Date] date
    )
    insert into t3
    select '001', 20,' 20120320'
    union all
    select '001', 33,' 20120321'
    union all
    select '002', 40,' 20120402'
    union all
    select '001', 50,' 20120601'
    union all
    select '002', 15,' 20120708'
    go
    
    ;with cte
    as
    (
    select a.GuestID,a.GuestName,b.CardCode,max(c.[date])  as maxdate
    from t1 a
    left join t2 b
    on a.GuestID = b.GuestID
    left join t3 c
    on b.CardCode = c.CardNo
    group by a.GuestID,a.GuestName,b.CardCode
    )
    
    
    select a.*,b.Consume
    from cte a
    left join t3 b
    on a.CardCode = b.CardNo 
    and a.maxdate = b.[Date]


    以上說明若有錯誤請指教,謝謝。
    歡迎參觀我的BLOG - 積沙成塔

    2012年11月15日 14:35
  • ;WITH etc 
    AS 
    (
    SELECT distinct GuestName,T1.GuestID,CardCode,MAX(date) OVER (PARTITION BY T3.CardNo ) AS maxdate FROM T1
    LEFT JOIN T2 ON  T1.GuestID=T2.GuestID
    LEFT JOIN T3 ON T2.CardCode = T3.CardNo
    )
    SELECT a.*,t3.Consume FROM etc AS a LEFT JOIN t3 ON a.CardCode=t3.CardNo AND a.maxdate=t3.date 


    麻将

    2012年11月16日 3:25

全部回复

  • 写法很多种,下列为其中一种可能的方式,希望对你有帮助。

    use tempdb
    go
    
    if object_id('t1') is not null
    	drop table t1
    go
    
    create table t1
    (
    	GuestID int,
    	GuestName nvarchar(5)
    )
    go
    
    insert into t1 values (1,'aaa'),(2,'bbb'),(3,'ccc')
    go
    
    if object_id('t2') is not null
    	drop table t2
    go
    
    create table t2
    (
    	GuestID int,
    	CardCode char(3)
    )
    go
    
    insert into t2 values (1,'001'),(2,'002')
    go
    
    if object_id('t3') is not null
    	drop table t3
    go
    
    create table t3
    (
    	CardNo char(3),
    	Consume	int,
    	[Date] date
    )
    insert into t3
    select '001', 20,' 20120320'
    union all
    select '001', 33,' 20120321'
    union all
    select '002', 40,' 20120402'
    union all
    select '001', 50,' 20120601'
    union all
    select '002', 15,' 20120708'
    go
    
    ;with cte
    as
    (
    select a.GuestID,a.GuestName,b.CardCode,max(c.[date])  as maxdate
    from t1 a
    left join t2 b
    on a.GuestID = b.GuestID
    left join t3 c
    on b.CardCode = c.CardNo
    group by a.GuestID,a.GuestName,b.CardCode
    )
    
    
    select a.*,b.Consume
    from cte a
    left join t3 b
    on a.CardCode = b.CardNo 
    and a.maxdate = b.[Date]


    以上說明若有錯誤請指教,謝謝。
    歡迎參觀我的BLOG - 積沙成塔

    2012年11月15日 14:35
  • 关注一下


    给我写信: QQ我:点击这里给我发消息

    2012年11月15日 16:07
  • ;WITH etc 
    AS 
    (
    SELECT distinct GuestName,T1.GuestID,CardCode,MAX(date) OVER (PARTITION BY T3.CardNo ) AS maxdate FROM T1
    LEFT JOIN T2 ON  T1.GuestID=T2.GuestID
    LEFT JOIN T3 ON T2.CardCode = T3.CardNo
    )
    SELECT a.*,t3.Consume FROM etc AS a LEFT JOIN t3 ON a.CardCode=t3.CardNo AND a.maxdate=t3.date 


    麻将

    2012年11月16日 3:25