----求SQL语句----请进

Steve_csdn 2005-05-02 08:49:36
有这样一个表,是账单的原始数据

消费者 子类型 类型 金额 消费时间
张三 就餐 餐饮 100.00 2005-05-02 15:50:50
张三 就餐 餐饮 100.00 2005-05-02 16:50:50
张三 点外卖 餐饮 100.00 2005-05-02 17:50:50
张三 喝酒 餐饮 100.00 2005-05-02 18:50:50
张三 游泳 休闲 80.00 2005-05-02 15:50:50
李四 就餐 餐饮 100.00 2005-05-02 16:50:50


这里有两个规则:
1、类型与子类型是一对多的关系,但类型同金额之间是一对一的关系,同一类型的消费金额是一样的
2、如果客人一天内进行了多次同一类型的消费,优惠规则是只收一次的钱,消费时间按第一次为准

将原始数据按如此规则进行处理得到客人的真正账单

消费者 子类型 类型 金额 消费时间
张三 就餐 餐饮 100.00 2005-05-02 15:50:50
张三 游泳 休闲 80.00 2005-05-02 15:50:50
李四 就餐 餐饮 100.00 2005-05-02 16:50:50

这SQL如何写?

谢谢!

...全文
247 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Steve_csdn 2005-05-06
  • 打赏
  • 举报
回复
up
xxljd 2005-05-05
  • 打赏
  • 举报
回复
select min(消费时间) from table group by corss(消费时间,24),类型,消费者
Steve_csdn 2005-05-05
  • 打赏
  • 举报
回复
这个行业里每天下午1点或者2点是一天的开始,而不是通常意义的晚上0点。

如果Convert(varchar(10),消費時間, 101) 那样一个客人头天晚上和第二天上午分别用餐一次的话,就会被收2份钱的,但实际的规则是只收一份的
Evelyn_ever 2005-05-05
  • 打赏
  • 举报
回复
不是,我知道错了
Evelyn_ever 2005-05-05
  • 打赏
  • 举报
回复
有个想法:如果用distinct,那么结果是不是就是第一条啊
Steve_csdn 2005-05-05
  • 打赏
  • 举报
回复
select min(消费时间) from table group by corss(消费时间,24),类型,消费者

----没太看明白:(
xiaos139 2005-05-04
  • 打赏
  • 举报
回复
Select X.消費者, X.子類型, X.類型,X.金額, X.消費時間 from
(Select 消費者,類型,xtime=Min(消費時間), MTime=Convert(varchar(10),消費時間, 101)
From Consume Group by 消費者,類型,Convert(varchar(10),消費時間, 101) ) As U
Join Consume X On U. 消費者 = X. 消費者 and U.類型 = X.類型 and U.xtime = X.消費時間
xiaos139 2005-05-04
  • 打赏
  • 举报
回复
Select X.消費者, X.子類型, X.類型,X.金額, X.消費時間 from
(Select 消費者,類型,xtime=Min(消費時間), MTime=Convert(varchar(10),消費時間, 101)
From Consume Group by 消費者,類型,Convert(varchar(10),消費時間, 101) ) As U
Join Consume X On U. 消費者 = X. 消費者 and U.類型 = X.類型 and U.xtime = X.消費時間
talantlee 2005-05-04
  • 打赏
  • 举报
回复
一樣
Steve_csdn 2005-05-04
  • 打赏
  • 举报
回复
感谢指教,这个问题怎样解决?

----这个行业里每天下午1点或者2点是一天的开始,而不是通常意义的晚上0点。


mschen 2005-05-03
  • 打赏
  • 举报
回复
那就这样再试试看:

select * from 表 a

join (select 消费者,类型,最早时间=min(消费时间) from 表 group by 消费者,类型,convert(char(10),消费时间,120)) t

on a.消费者=t.消费者 and a.类型=t.类型 and a.消费时间=t.最早时间
Steve_csdn 2005-05-03
  • 打赏
  • 举报
回复
不好意思,这个怨我没说清楚,left(消费时间,10)是不行的,因为在这个行业里每天下午1点或者2点是一天的开始,而不是通常意义的晚上0点。

不过分还是会给的:)

gaojie666 2005-05-03
  • 打赏
  • 举报
回复
select min(消费时间) from table group by left(消费时间,10),类型,消费者
hualong7501 2005-05-03
  • 打赏
  • 举报
回复
这个问题很难,难就难在对消费时间的处理上,求出一天中最早时间很简单,用MIN函数就可以了,在使用MIN函数之前应该对时间分组,分组条件是把具体几点几分去掉后的日期,例如‘2005-05-01’.
呵呵,在这讲了一大堆废话,我也不会写这条语句。
myjce 2005-05-02
  • 打赏
  • 举报
回复
select 消费者,类型,金额,Min(消费时间) as 消费时间 group by 消费者,类型,金额,消费时间
Steve_csdn 2005-05-02
  • 打赏
  • 举报
回复
就假设原始数据的表叫data,整理后的表叫bill吧,写起来比较方便

两个表的结构是一样的
id subtype type fee time
消费者 子类型 类型 金额 消费时间
张三 就餐 餐饮 100.00 2005-05-01 15:50:50
Steve_csdn 2005-05-02
  • 打赏
  • 举报
回复
请注意这个规则:
2、如果客人一天内进行了多次同一类型的消费,优惠规则是只收一次的钱,消费时间按第一次为准

消费者 子类型 类型 金额 消费时间
张三 就餐 餐饮 100.00 2005-05-01 15:50:50
张三 就餐 餐饮 100.00 2005-05-02 15:50:50
张三 就餐 餐饮 100.00 2005-05-02 16:50:50
张三 点外卖 餐饮 100.00 2005-05-02 17:50:50
张三 喝酒 餐饮 100.00 2005-05-02 18:50:50
张三 游泳 休闲 80.00 2005-05-02 15:50:50
李四 就餐 餐饮 100.00 2005-05-02 16:50:50



将原始数据按如此规则进行处理得到客人的真正账单

消费者 子类型 类型 金额 消费时间
张三 就餐 餐饮 100.00 2005-05-01 15:50:50
张三 就餐 餐饮 100.00 2005-05-02 15:50:50
张三 游泳 休闲 80.00 2005-05-02 15:50:50
李四 就餐 餐饮 100.00 2005-05-02 16:50:50

mschen 2005-05-02
  • 打赏
  • 举报
回复
或者也可以这样来写:


select * from 表 a

where 消费时间=
(select min(消费时间) from 表 where 消费者=a.消费者 and 类型=a.类型)
mschen 2005-05-02
  • 打赏
  • 举报
回复
select * from 表 a

join (select 消费者,类型,最早时间=min(消费时间) from 表 group by 消费者,类型) t

on a.消费者=t.消费者 and a.类型=t.类型 and a.消费时间=t.最早时间

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧