帮忙看下这个语句
select right(客户,len(客户)-charindex( '- ',客户))as 客户, 数量, 金额
FROM
(select distinct 客户,null as 数量,null as 金额 from 表 union
select 客户+ '- '+商品+规格,sum(数量),sum(金额) from 表 group by 客户,商品,规格)T
表的格式是这样的:
客户 商品 规格 数量 金额 日期
张三 电脑 x32 10 100 2007-01-01
张三 电脑 x32 20 200 2007-01-03
李四 电脑 x32 10 100 2007-01-02
张三 手机 10 200 2007-01-20
想要这样的结果:
客户 数量 金额 日期
张三 2007-01-20 (这里日期取同客户的最大日期)
电脑x32 30 300 2007-01-03 (这里日期取同商品同规格的最大日期)
手机 10 200 2007-01-20
李四
电脑x32 10 100 2007-01-02
但是用上面的语句运行之后没有规格的商品显示不出来.还有就是用这个语句如何取最大日期,就是要求的那样?
[解决办法]
人在网吧,没有测试环境,如果没有写对请间谅
SELECT 客户,数量,金额,日期
FROM
(
SELECT 商品+规格 AS 客户,SUM(数量) AS 数量,SUM(金额) AS 金额,max(日期) AS 日期,1 as flag
FROM 表 GROUP BY 客户,商品+规格,数量
UNION ALL
SELECT 客户,null,null,max(日期),0 as flag FROM 表 GROUP BY 客户
) A ORDER BY 客户,flag
[解决办法]
select 客户, 数量=NULL, 金额=NULL, 日期=max(日期)
from T
group by 客户
union all
select 商品=商品+isnull(规格, ' '), 数量=sum(数量), 金额=sum(金额), 日期=max(日期)
from T
group by 客户, 商品+isnull(规格, ' ')
[解决办法]
create table T(客户 varchar(10), 商品 varchar(10), 规格 varchar(10), 数量 int, 金额 int, 日期 datetime)
insert T select '张三 ', '电脑 ', 'x32 ', 10, 100, '2007-01-01 '
union all select '张三 ', '电脑 ', 'x32 ', 20, 200, '2007-01-03 '
union all select '李四 ', '电脑 ', 'x32 ', 10, 100, '2007-01-02 '
union all select '张三 ', '手机 ', NULL, 10, 200, '2007-01-20 '
select tmp.客户, tmp.数量, tmp.金额, tmp.日期
from
(
select 客户, 数量=NULL, 金额=NULL, 日期=max(日期), sort=客户
from T
group by 客户
union all
select 商品=商品+isnull(规格, ' '), 数量=sum(数量), 金额=sum(金额), 日期=max(日期), sort=客户
from T
group by 客户, 商品+isnull(规格, ' ')
)tmp
order by tmp.sort desc, tmp.数量
--result
客户 数量 金额 日期
-------------------- ----------- ----------- ------------------------------------------------------
张三 NULL NULL 2007-01-20 00:00:00.000
手机 10 200 2007-01-20 00:00:00.000
电脑x32 30 300 2007-01-03 00:00:00.000
李四 NULL NULL 2007-01-02 00:00:00.000
电脑x32 10 100 2007-01-02 00:00:00.000
(5 row(s) affected)
[解决办法]
create table 表(客户 varchar(100), 商品 varchar(100), 规格 varchar(100), 数量 int, 金额 int, 日期 datetime)
insert 表 select '张三 ', '电脑 ', 'x32 ', 10, 100, '2007-01-01 '
union all select '张三 ', '电脑 ', 'x32 ', 20, 200, '2007-01-03 '
union all select '李四 ', '电脑 ', 'x32 ', 10, 100, '2007-01-02 '
union all select '张三 ', '手机 ', ' ', 20, 200, '2007-01-20 '
select
right(客户,len(客户)-charindex( '- ',客户))as 客户, 数量, 金额,日期
from
(select distinct 客户,null as 数量,null as 金额,max(日期) as 日期,orderid=客户 from 表 group by 客户
union
select 客户+ '- '+商品+规格,sum(数量),sum(金额),max(日期),orderid=客户 from 表 group by 客户,商品,规格
)T
order by
orderid desc
drop table 表
/*
客户数量金额日期
---------------------------------------------
张三NULLNULL2007-01-20
电脑x32303002007-01-03
手机202002007-01-20
李四NULLNULL2007-01-02
电脑x32101002007-01-02
*/
[解决办法]
gc_ding(施主,给个妞泡好么) 如果空用 null 表示的话,前面的商品还是显示不出来,感谢!
-----------------------------------------------
这样改就行了:
create table 表(客户 varchar(100), 商品 varchar(100), 规格 varchar(100), 数量 int, 金额 int, 日期 datetime)
insert 表 select '张三 ', '电脑 ', 'x32 ', 10, 100, '2007-01-01 '
union all select '张三 ', '电脑 ', 'x32 ', 20, 200, '2007-01-03 '
union all select '李四 ', '电脑 ', 'x32 ', 10, 100, '2007-01-02 '
union all select '张三 ', '手机 ',NULL, 20, 200, '2007-01-20 '
select
right(客户,len(客户)-charindex( '- ',客户))as 客户, 数量, 金额,日期
from
(select distinct 客户,null as 数量,null as 金额,max(日期) as 日期,orderid=客户 from 表 group by 客户
union
select 客户+ '- '+isnull(商品, ' ')+isnull(规格, ' '),sum(数量),sum(金额),max(日期),orderid=客户 from 表 group by 客户,商品,规格
)T
order by
orderid desc
drop table 表
/*
客户数量金额日期
---------------------------------------------
张三NULLNULL2007-01-20
电脑x32303002007-01-03
手机202002007-01-20
李四NULLNULL2007-01-02
电脑x32101002007-01-02
*/