再问一个复杂的SQL问题,谢谢大家!

zhengkaining 2017-12-29 07:55:11
现有一个餐饮账单,这个账单可能包含套菜,

主表
单号 序号 套菜名称 单价 数量
1 1 1000标准 1000 1
1 2 1000标准 1000 1

套菜表
单号 主单序号 套菜序号 商品 单价 数量
1 1 1 鱼香肉丝 12 1
1 1 2 宫保鸡丁 12 1
....

1 2 1 鱼香肉丝 12 1
1 2 2 宫保鸡丁 12 1
...

要求判断套菜明细是否一致(品名,单价,数量),如果一致的话汇总主单,不一致不用汇总,成为(序号取其中一个即可)

单号 序号 套菜名称 单价 数量
1 1 1000标准 1000 2

谢谢大家。要求支持SQL2000
...全文
350 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
OwenZeng_DBA 2018-01-02
  • 打赏
  • 举报
回复
引用 5 楼 mcxhh2005 的回复:
read ,but not very clear you meant
为什么你每次都要用英语呢
ChinaITOldMan 2018-01-02
  • 打赏
  • 举报
回复
read ,but not very clear you meant
zjcxc 2018-01-02
  • 打赏
  • 举报
回复
要求判断套菜明细是否一致(品名,单价,数量), ------------------- 这个没办法判断,这个从哪里拿标准? 个人觉得你这个点菜不应该存在套菜明细的问题,点的是套菜就只记录一个套菜(要明细通过查询出来,并不记录) 单点就是单点,哪怕是单点把套菜的所有菜都点了,仍然是单点
道素 2018-01-02
  • 打赏
  • 举报
回复
可以考虑将淘菜的所有子项合并为一个字符串(注意要同样的顺序)
然后再用这个group by
但是你这是sql server 2000. 不仅不支持XML Path,即使是XML RAW也不支持在子语句中
还有很多语句不支持(为什么用这么老的数据库,这就是给自己找麻烦)
另外用转置也可以,但是SQL 2000也不支持

因此可以间接考虑定义一个function处理这种情况

if object_id('menuset') is not null drop table menuset
if object_id('menudetail') is not null drop table menudetail
create table menuset(单号 int,序号 int,套菜名称 nvarchar(100),单价 money,数量 int)
create table menudetail(单号 int,主单序号 int,套菜序号 int,商品 nvarchar(100),单价 money,数量 int)
insert into menuset(单号,序号,套菜名称,单价,数量)
select 1,1,N'1000标准',100,1 union all
select 1,2,N'1000标准',100,1 union all
select 1,3,N'1000标准',100,1
insert into menudetail(单号,主单序号,套菜序号,商品,单价,数量)
select 1,1,1,N'鱼香肉丝',12,1 union all
select 1,1,2,N'宫保鸡丁',12,1 union all
select 1,2,1,N'鱼香肉丝',12,1 union all
select 1,2,2,N'宫保鸡丁',12,1 union all
select 1,3,1,N'鱼香肉丝',10,1 union all
select 1,3,2,N'宫保鸡丁',12,1

create function fn_getMenuDetail(@OrderID int,@MenuID int)
RETURNS nvarchar(4000)
AS
begin
declare @str nvarchar(4000)
select @str=isnull(@str+N'//','')+商品+','+convert(nvarchar(100),单价)+','+convert(nvarchar(100),数量) from menudetail as md where 单号=@OrderID and 主单序号=@MenuID order by 商品
return @str
end



select 单号,min(序号) as 序号, 套菜名称,单价,数量,count(0) as [Count] from menuset
group by 单号,套菜名称,单价,数量,dbo.fn_getMenuDetail(单号,序号)




日月路明 2017-12-31
  • 打赏
  • 举报
回复
我个人认为,数据设计有问题,所以你的解决方案将会非常复杂,甚至无解
zhengkaining 2017-12-30
  • 打赏
  • 举报
回复
没人回答?很伤心,都在放假?可以加分的。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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