这个SQL把我难住了,高手们进来看一下,统计和字符串处理的问题。。

insnowind 2007-06-07 11:12:08
有这样几个表:
档位表:

MarketID BoothID BoothType
440308005021 1 猪肉
440308005021 2 猪肉
440308005021 3 猪肉
440308005021 4 猪肉
440308005021 5 猪肉
440308005021 6 猪肉

票据表:
MarketUID BoothID BillNo Date
440308005021 1 AACB39494040 2006-01-01
440308005021 2 AACR39494040 2006-01-01
440308005021 4 AACC39445640 2006-01-01

预警表:

MarketUID BoothUID Date FeedBack
440308005021 3 2006-01-01 有票,编码是AACB39494040.
440308005021 6 2006-01-01 停业.

====================================================
现在要求统计出这样的效果:

MarketUID BoothUID Date BillNo FeedBack IsExisted

主要有这几个要点:
1.统计全年440308005021市场所有猪肉档的票据和预警情况;
2.根据档位在票据表中查找,如果当天有票,则在结果集中BillNo字段列出BillNo,
如果在票据表中找不到,则在预警表中找,如果找到就在结果集feedback中显示;
都找不到,就显示空;
3.如果预警中有记录,从feedback中提出票据编码,再在票据表中查询,如果存在此票,在isexisted字段显示true,否则显示false;
==================================================
第三个问题不太好弄啊。




...全文
1653 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lazhudi 2007-06-13
  • 打赏
  • 举报
回复
Mark
maopi9999 2007-06-12
  • 打赏
  • 举报
回复
O_o
w_f 2007-06-10
  • 打赏
  • 举报
回复
Mark一下!
falwdz 2007-06-09
  • 打赏
  • 举报
回复
mark
Forget_Kevinx 2007-06-08
  • 打赏
  • 举报
回复
1mark
gx_055 2007-06-08
  • 打赏
  • 举报
回复
晕,这个很难吗?怎么都看不懂哦
playwarcraft 2007-06-07
  • 打赏
  • 举报
回复
試下
substring(C.FeedBack, patindex('%[0-9A-z]%',C.FeedBack),len(C.FeedBack)-patindex('%[0-9A-z]%',C.FeedBack))

exg:
--假設以句號'.'結尾,並且緊跟票據
--如果不是,只要reverse(@s),然後找出來第一個數字或字母,再計算

declare @s varchar(100)
set @s='我是,票據是ADSF88888832.'
select substring(@s, patindex('%[0-9A-z]%',@s),len(@s)-patindex('%[0-9A-z]%',@s))

/*
------------------
ADSF88888832
*/
insnowind 2007-06-07
  • 打赏
  • 举报
回复
insnowind 2007-06-07
  • 打赏
  • 举报
回复
如果都是字母或數字,還是可以抓的,總要有一個邏輯是吧
======================================
都是数字和小写字母,大写字母,长度为11,12或者13
insnowind 2007-06-07
  • 打赏
  • 举报
回复
我列一个结果集的样子吧,可能更容易理解一点:
MarketUID BoothUID Date BillNo FeedBack IsExisted
440308005021 1 2006-01-01 AACB39494040
440308005021 2 2006-01-01 AACR39494040
440308005021 3 2006-01-01 有票,编码是AACB39494040. false
440308005021 4 2006-01-01 AACC39445640
440308005021 5 2006-01-01
440308005021 6 2006-01-01 停业
440308005021 1 2006-01-02 AACB39494040
440308005021 2 2006-01-02 AACR39494040
440308005021 3 2006-01-02 有票,编码是AACB39494040. false
440308005021 4 2006-01-02 AACC39445640
440308005021 5 2006-01-02
440308005021 6 2006-01-02 停业
playwarcraft 2007-06-07
  • 打赏
  • 举报
回复
如果都是字母或數字,還是可以抓的,總要有一個邏輯是吧
insnowind 2007-06-07
  • 打赏
  • 举报
回复
而且票据编码有11,12,13几个长度,就是说长度不固定,SQL能不能用正则呢
insnowind 2007-06-07
  • 打赏
  • 举报
回复
select
A.MarketID, A.BoothID,
B.[date],
B.billNo,
C.FeedBack,
case when exists (select 1 from 票据表 where BillNo=substring(isnull(C.FeedBack,''),7,12))
then 'true' else 'false' end as IsExisted

from 档位表 A
left join 票据表 B
on A.MarketUID=B.MarketUID and A.BoothID=B.BoothID
left join 预警表 C
on A.MarketUID=C.MarketUID and A.BoothID=C.BoothID

where A.BoothType='猪肉'

====================================
非常感谢,不过我有两个问题没有表述清楚
1.在left Join时还要考虑到时间,要列出每天的情况,所以时间要考虑进去,比如说今天2006-01-03,那么在票据表和预警表中也必需是时间也是2006-01-03
2.substring(isnull(C.FeedBack,''),7,12))
这里这个字符串的位置不是固定的,feedback里也可能是“有票,票据编码是*******”;
playwarcraft 2007-06-07
  • 打赏
  • 举报
回复
第三个问题
------------------
需要給出抓 票据编码 的邏輯
playwarcraft 2007-06-07
  • 打赏
  • 举报
回复
select
A.MarketID, A.BoothID,
B.[date],
B.billNo,
C.FeedBack,
case when exists (select 1 from 票据表 where BillNo=substring(isnull(C.FeedBack,''),7,12))
then 'true' else 'false' end as IsExisted

from 档位表 A
left join 票据表 B
on A.MarketUID=B.MarketUID and A.BoothID=B.BoothID
left join 预警表 C
on A.MarketUID=C.MarketUID and A.BoothID=C.BoothID

where A.BoothType='猪肉'
insnowind 2007-06-07
  • 打赏
  • 举报
回复
似乎不是太难啊,用相关子查询就可以啊.当然一个语句可能比较麻烦.写个存储过程解决应该简单些
======================
您能不能帮我写一个试试,我自己写的太麻烦,所以希望能有一个比较高效的,还有第三个问题怎么解决,请赐教!
netcup 2007-06-07
  • 打赏
  • 举报
回复
似乎不是太难啊,用相关子查询就可以啊.当然一个语句可能比较麻烦.写个存储过程解决应该简单些
insnowind 2007-06-07
  • 打赏
  • 举报
回复
看来一条语句搞不定,写个存储过程算了
insnowind 2007-06-07
  • 打赏
  • 举报
回复
加上 and datediff(day,[Date],getdate())=0
=======================
你好,第三个问题基本上解决了,在你的指导下,我是这样搞的

Select Feedback,
BillNo=SubString(Cast(Feedback As VarChar(128)),patIndex('%[0-9A-z]%',Feedback),
len(Cast(Feedback As VarChar(128)))-patIndex('%[0-9A-z]%',Feedback)-patIndex('%[0-9A-z]%',Reverse(Cast(Feedback As VarChar(128))))+2),
TT=Case When Exists(Select * From FS_FoodBill Where FoodAttestationCode=SubString(Cast(Feedback As VarChar(128)),patIndex('%[0-9A-z]%',Feedback),
len(Cast(Feedback As VarChar(128)))-patIndex('%[0-9A-z]%',Feedback)-patIndex('%[0-9A-z]%',Reverse(Cast(Feedback As VarChar(128))))+2)) Then 'Yes' Else 'No' End
From 预警表 Where MarketUID = '440308005021'

现在的问题是我想要每一天的数据,该怎么统计,加上 and datediff(day,[Date],getdate())=0的话,如果当天没有票没有预警就会显示不出来了。
playwarcraft 2007-06-07
  • 打赏
  • 举报
回复
加上 and datediff(day,[Date],getdate())=0
加载更多回复(2)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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