正在学习sql,新手,向前辈们学习请教,
刚工作没多久,因为在单位使用ERP软件的缘故,用的sql2000数据库,查询分析器会一些简单查询。
公司是商品流通行业,做小家电销售。
有时候很无聊,反正按照ERP软件作……
想做一些业务的进阶分析,可能的话,自己也多学些。嗯,反正觉得职场路不好走……
比如现在考虑作几张报表,向前辈们请教了,谢谢!想做销售分析报表,通过这样的方式系统学习sql
一种方式是按客户排名
例:
排名 客户名称 年度1月份 2月份 3月份 4月份 5月份 6月份 7月份 8月份 9月份 10月份 11月份 12月份 总计 比率
1 a公司 2009 100万 100万 100万 100万 100万 100万 100万 100万 100万 100万 100万 100万 1200万 56%
2 b公司 2009 80万 80万 80万 80万 80万 80万 80万 80万 80万 80万 80万 80万 960万 44%
……
……
说明:1、排名是按照数据库里销货明细表(XHD)按客户查询的汇总值,当前时间a公司汇总值最高,就排名第一
2、每月销货明细表(XHD)汇总
3、要有所有月份的总计和每个客户所占销售额的比率
4、要有年度区分
5、我想销货明细表(XHD)关键字段为客户名称、销货日期、金额
6、希望前辈们就语句阐述下思路多谢!
刚工作没多久,因为在单位使用ERP软件的缘故,用的sql2000数据库,查询分析器会一些简单查询。
公司是商品流通行业,做小家电销售。
有时候很无聊,反正按照ERP软件作……
想做一些业务的进阶分析,可能的话,自己也多学些。嗯,反正觉得职场路不好走……
比如现在考虑作几张报表,向前辈们请教了,谢谢!想做销售分析报表,通过这样的方式系统学习sql
一种方式是按客户排名
例:
排名 客户名称 年度1月份 2月份 3月份 4月份 5月份 6月份 7月份 8月份 9月份 10月份 11月份 12月份 总计 比率
1 a公司 2009 100万 100万 100万 100万 100万 100万 100万 100万 100万 100万 100万 100万 1200万 56%
2 b公司 2009 80万 80万 80万 80万 80万 80万 80万 80万 80万 80万 80万 80万 960万 44%
……
……
说明:1、排名是按照数据库里销货明细表(XHD)按客户查询的汇总值,当前时间a公司汇总值最高,就排名第一
2、每月销货明细表(XHD)汇总
3、要有所有月份的总计和每个客户所占销售额的比率
4、要有年度区分
5、我想销货明细表(XHD)关键字段为客户名称、销货日期、金额
6、希望前辈们就语句阐述下思路多谢!
不知道我这样说的对不对,
比如,公司ERP数据库名YMGM,
销货明细单在数据库里有两张表,
一张是销货单单头档JSKKEA,关键字段编号为KEA001单号、KEA003日期、KEA004客户
另一张是销货单单身档JSKKEB,关键字段编号为KEB001单号、KEB031本币价税合计
其中KEA001单号和KEB001单号是对应的
例:
JSKKEA表
KEA001(单号) KEA003(日期) KEA004(客户)
20081230001 20081230 客户a
20081230002 20081230 客户b
20090101001 20090101 客户a
20090102001 20090102 客户b
20090103001 20090103 客户a
20090104001 20090104 客户b
20090201001 20090201 客户a
20090202001 20090202 客户bJSKKEB表
KEB001(单号) KEA031(本币税价合计)
20081230001 100万
20081230002 50万
20090101001 100万
20090102001 100万
20090103001 50万
20090104001 100万
20090201001 50万
20090202001 100万可以看出2008年12月份 客户a销售额为100万,客户b销售额为50万;客户a2008年度销售额大于客户b2008年度销售额;客户a所占2008年度销售总额为67%,客户b所占2008年度销售总额为33%;
2009年1月份客户b销售额为200万,2月份为100万;2009年1月份客户a销售额为150万,2月份为50万;客户b2009年度销售额大于客户a2009年度销售额;客户b所占2009年度销售总额为60%,客户a所占2009年度销售总额为40%;我想要在这两张表得出的结果如下:
排名 客户名称 年度 1月份 2月份 3月份 4月份 5月份 6月份 7月份 8月份 9月份 10月份 11月份 12月份 总计 比率
1 客户a 2008 100万 100万 67%
2 客户b 2008 50万 50万 33%
1 客户b 2009 200万 100万 300万 60%
2 客户a 2009 150万 50万 200万 40%
标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql) --SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')---------------------------------/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分
---- ---- ---- ---- ------ ----
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/--SQL SERVER 2000 静态SQL。
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理,
cast(avg(分数*1.0) as decimal(18,2)) 平均分,
sum(分数) 总分
from tb
group by 姓名--SQL SERVER 2000 动态SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
exec(@sql) --SQL SERVER 2005 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名')drop table tb ------------------
-- Author : liangCK 小梁 & angellan 兰儿
-- Comment: 小梁 爱 兰儿
-- Date : 2009-06-03 09:24:11
-------------------------------------------
--> 生成测试数据: [JSKKEA]
IF OBJECT_ID('[JSKKEA]') IS NOT NULL DROP TABLE [JSKKEA]
CREATE TABLE [JSKKEA] (KEA001 BIGINT,KEA003 DATETIME,KEA004 VARCHAR(5))
INSERT INTO [JSKKEA]
SELECT 20081230001,'20081230','客户a' UNION ALL
SELECT 20081230002,'20081230','客户b' UNION ALL
SELECT 20090101001,'20090101','客户a' UNION ALL
SELECT 20090102001,'20090102','客户b' UNION ALL
SELECT 20090103001,'20090103','客户a' UNION ALL
SELECT 20090104001,'20090104','客户b' UNION ALL
SELECT 20090201001,'20090201','客户a' UNION ALL
SELECT 20090202001,'20090202','客户b'
--> 生成测试数据: [JSKKEB]
IF OBJECT_ID('[JSKKEB]') IS NOT NULL DROP TABLE [JSKKEB]
CREATE TABLE [JSKKEB] (KEB001 BIGINT,KEA031 VARCHAR(5))
INSERT INTO [JSKKEB]
SELECT 20081230001,'100万' UNION ALL
SELECT 20081230002,'50万' UNION ALL
SELECT 20090101001,'100万' UNION ALL
SELECT 20090102001,'100万' UNION ALL
SELECT 20090103001,'50万' UNION ALL
SELECT 20090104001,'100万' UNION ALL
SELECT 20090201001,'50万' UNION ALL
SELECT 20090202001,'100万'--SQL查询如下:SELECT
A.KEA004 AS 客户名称,
YEAR(A.KEA003) AS 年度,
SUM(CASE WHEN MONTH(KEA003) = 1
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [1月份],
SUM(CASE WHEN MONTH(KEA003) = 2
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [2月份],
SUM(CASE WHEN MONTH(KEA003) = 3
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [3月份],
SUM(CASE WHEN MONTH(KEA003) = 4
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [4月份],
SUM(CASE WHEN MONTH(KEA003) = 5
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [5月份],
SUM(CASE WHEN MONTH(KEA003) = 6
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [6月份],
SUM(CASE WHEN MONTH(KEA003) = 7
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [7月份],
SUM(CASE WHEN MONTH(KEA003) = 8
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [8月份],
SUM(CASE WHEN MONTH(KEA003) = 9
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [9月份],
SUM(CASE WHEN MONTH(KEA003) = 10
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [10月份],
SUM(CASE WHEN MONTH(KEA003) = 11
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [11月份],
SUM(CASE WHEN MONTH(KEA003) = 12
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [12月份],
SUM(CAST(LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1) AS NUMERIC(20,4))) AS [总计]
FROM [JSKKEA] AS A
JOIN [JSKKEB] AS B
ON A.KEA001 = B.KEB001
GROUP BY A.KEA004,YEAR(A.KEA003);--删除测试
DROP TABLE [JSKKEA],[JSKKEB]/*
客户名称 年度 1月份 2月份 3月份 4月份 5月份 6月份 7月份 8月份 9月份 10月份 11月份 12月份 总计
----- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ---------------------------------------
客户a 2008 0 0 0 0 0 0 0 0 0 0 0 100 100.0000
客户a 2009 150 50 0 0 0 0 0 0 0 0 0 0 200.0000
客户b 2008 0 0 0 0 0 0 0 0 0 0 0 50 50.0000
客户b 2009 200 100 0 0 0 0 0 0 0 0 0 0 300.0000(4 row(s) affected)*/
create table JSKKEA(KEA001 varchar(20), KEA003 varchar(20), KEA004 varchar(20))
insert into JSKKEA
select '20081230001', '20081230', '客户a' union all
select '20081230002', '20081230', '客户b' union all
select '20090101001', '20090101', '客户a' union all
select '20090102001', '20090102', '客户b' union all
select '20090103001', '20090103', '客户a' union all
select '20090104001', '20090104', '客户b' union all
select '20090201001', '20090201', '客户a' union all
select '20090202001', '20090202', '客户b' create table JSKKEB(KEB001 varchar(20), KEA031 varchar(20))
insert into JSKKEB
select '20081230001', '100万' union all
select '20081230002', '50万' union all
select '20090101001', '100万' union all
select '20090102001', '100万' union all
select '20090103001', '50万' union all
select '20090104001', '100万' union all
select '20090201001', '50万' union all
select '20090202001', '100万' select KEA004 as 客户名称,
datepart(year,cast(KEA003 as datetime)) as 年份,
[1月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=1 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[2月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=2 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[3月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=3 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[4月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=4 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[5月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=5 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[6月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=6 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[7月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=7 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[8月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=8 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[9月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=9 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[10月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=10 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[11月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=11 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[12月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=12 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
总计 = cast(sum(cast(replace(b.KEA031,'万','') as int)) as varchar(20))+'万',
比率 = replace(cast(sum(cast(replace(b.KEA031,'万','') as int))*1.0/(select sum(cast(replace(KEA031,'万','') as int)) from JSKKEB where KEB001 in(select KEA001 from JSKKEA where datepart(year,cast(KEA003 as datetime))= datepart(year,cast(a.KEA003 as datetime)))) as decimal(18,2))*100,'.00','%')
from JSKKEA a ,JSKKEB b
where a.KEA001 = b.KEB001
group by KEA004,datepart(year,cast(KEA003 as datetime))
order by 年份,客户名称drop table JSKKEA,JSKKEB
/*
客户a 2008 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 100万 100万 67%
客户b 2008 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 50万 50万 33%
客户a 2009 150万 50万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 200万 40%
客户b 2009 200万 100万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 300万 60%
*/
create table JSKKEA(KEA001 varchar(20), KEA003 varchar(20), KEA004 varchar(20))
insert into JSKKEA
select '20081230001', '20081230', '客户a' union all
select '20081230002', '20081230', '客户b' union all
select '20090101001', '20090101', '客户a' union all
select '20090102001', '20090102', '客户b' union all
select '20090103001', '20090103', '客户a' union all
select '20090104001', '20090104', '客户b' union all
select '20090201001', '20090201', '客户a' union all
select '20090202001', '20090202', '客户b' create table JSKKEB(KEB001 varchar(20), KEA031 varchar(20))
insert into JSKKEB
select '20081230001', '100万' union all
select '20081230002', '50万' union all
select '20090101001', '100万' union all
select '20090102001', '100万' union all
select '20090103001', '50万' union all
select '20090104001', '100万' union all
select '20090201001', '50万' union all
select '20090202001', '100万' select 排名= row_number() over(partition by 年份 order by 比率 desc),*
from
(
select KEA004 as 客户名称,
datepart(year,cast(KEA003 as datetime)) as 年份,
[1月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=1 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[2月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=2 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[3月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=3 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[4月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=4 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[5月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=5 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[6月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=6 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[7月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=7 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[8月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=8 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[9月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=9 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[10月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=10 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[11月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=11 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
[12月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=12 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',
总计 = cast(sum(cast(replace(b.KEA031,'万','') as int)) as varchar(20))+'万',
比率 = replace(cast(sum(cast(replace(b.KEA031,'万','') as int))*1.0/(select sum(cast(replace(KEA031,'万','') as int)) from JSKKEB where KEB001 in(select KEA001 from JSKKEA where datepart(year,cast(KEA003 as datetime))= datepart(year,cast(a.KEA003 as datetime)))) as decimal(18,2))*100,'.00','%')
from JSKKEA a ,JSKKEB b
where a.KEA001 = b.KEB001
group by KEA004,datepart(year,cast(KEA003 as datetime))
)Tdrop table JSKKEA,JSKKEB
/*
1 客户a 2008 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 100万 100万 67%
2 客户b 2008 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 50万 50万 33%
1 客户b 2009 200万 100万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 300万 60%
2 客户a 2009 150万 50万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 200万 40%
*/
-- Author : liangCK 小梁 & angellan 兰儿
-- Comment: 小梁 爱 兰儿
-- Date : 2009-06-03 09:24:11
-------------------------------------------
--> 生成测试数据: [JSKKEA]
IF OBJECT_ID('[JSKKEA]') IS NOT NULL DROP TABLE [JSKKEA]
CREATE TABLE [JSKKEA] (KEA001 BIGINT,KEA003 DATETIME,KEA004 VARCHAR(5))
INSERT INTO [JSKKEA]
SELECT 20081230001,'20081230','客户a' UNION ALL
SELECT 20081230002,'20081230','客户b' UNION ALL
SELECT 20090101001,'20090101','客户a' UNION ALL
SELECT 20090102001,'20090102','客户b' UNION ALL
SELECT 20090103001,'20090103','客户a' UNION ALL
SELECT 20090104001,'20090104','客户b' UNION ALL
SELECT 20090201001,'20090201','客户a' UNION ALL
SELECT 20090202001,'20090202','客户b'
--> 生成测试数据: [JSKKEB]
IF OBJECT_ID('[JSKKEB]') IS NOT NULL DROP TABLE [JSKKEB]
CREATE TABLE [JSKKEB] (KEB001 BIGINT,KEA031 VARCHAR(5))
INSERT INTO [JSKKEB]
SELECT 20081230001,'100万' UNION ALL
SELECT 20081230002,'50万' UNION ALL
SELECT 20090101001,'100万' UNION ALL
SELECT 20090102001,'100万' UNION ALL
SELECT 20090103001,'50万' UNION ALL
SELECT 20090104001,'100万' UNION ALL
SELECT 20090201001,'50万' UNION ALL
SELECT 20090202001,'100万'--SQL查询如下:SELECT
A.KEA004 AS 客户名称,
YEAR(A.KEA003) AS 年度,
SUM(CASE WHEN MONTH(KEA003) = 1
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [1月份],
SUM(CASE WHEN MONTH(KEA003) = 2
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [2月份],
SUM(CASE WHEN MONTH(KEA003) = 3
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [3月份],
SUM(CASE WHEN MONTH(KEA003) = 4
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [4月份],
SUM(CASE WHEN MONTH(KEA003) = 5
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [5月份],
SUM(CASE WHEN MONTH(KEA003) = 6
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [6月份],
SUM(CASE WHEN MONTH(KEA003) = 7
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [7月份],
SUM(CASE WHEN MONTH(KEA003) = 8
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [8月份],
SUM(CASE WHEN MONTH(KEA003) = 9
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [9月份],
SUM(CASE WHEN MONTH(KEA003) = 10
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [10月份],
SUM(CASE WHEN MONTH(KEA003) = 11
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [11月份],
SUM(CASE WHEN MONTH(KEA003) = 12
THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
ELSE 0 END) AS [12月份],
SUM(CAST(LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1) AS NUMERIC(20,4))) AS [总计],
RTRIM(CAST(
SUM(CAST(LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1) AS NUMERIC(20,4))) * 100.
/(SELECT SUM(CAST(LEFT(D.KEA031,PATINDEX('%[^0-9.]%',D.KEA031)-1) AS NUMERIC(20,4)))
FROM [JSKKEA] AS C
JOIN [JSKKEB] AS D
ON C.KEA001 = D.KEB001
WHERE YEAR(C.KEA003) = YEAR(A.KEA003)) AS INT)) + '%' AS [比率]
FROM [JSKKEA] AS A
JOIN [JSKKEB] AS B
ON A.KEA001 = B.KEB001
GROUP BY A.KEA004,YEAR(A.KEA003)
ORDER BY 2,1;
--删除测试
DROP TABLE [JSKKEA],[JSKKEB]/*
客户名称 年度 1月份 2月份 3月份 4月份 5月份 6月份 7月份 8月份 9月份 10月份 11月份 12月份 总计 比率
----- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- --------------------------------------- -------------
客户a 2008 0 0 0 0 0 0 0 0 0 0 0 100 100.0000 66%
客户b 2008 0 0 0 0 0 0 0 0 0 0 0 50 50.0000 33%
客户a 2009 150 50 0 0 0 0 0 0 0 0 0 0 200.0000 40%
客户b 2009 200 100 0 0 0 0 0 0 0 0 0 0 300.0000 60%(4 row(s) affected)*/
INSERT @TA
SELECT '20081230001', '20081230', N'客户a' UNION ALL
SELECT '20081230002', '20081230', N'客户b' UNION ALL
SELECT '20090101001', '20090101', N'客户a' UNION ALL
SELECT '20090102001', '20090102', N'客户b' UNION ALL
SELECT '20090103001', '20090103', N'客户a' UNION ALL
SELECT '20090104001', '20090104', N'客户b' UNION ALL
SELECT '20090201001', '20090201', N'客户a' UNION ALL
SELECT '20090202001', '20090202', N'客户b'DECLARE @TB TABLE([KEB001] VARCHAR(11), [KEA031] INT)
INSERT @TB
SELECT '20081230001', 100 UNION ALL
SELECT '20081230002', 50 UNION ALL
SELECT '20090101001', 100 UNION ALL
SELECT '20090102001', 100 UNION ALL
SELECT '20090103001', 50 UNION ALL
SELECT '20090104001', 100 UNION ALL
SELECT '20090201001', 50 UNION ALL
SELECT '20090202001', 100SELECT *,ID=IDENTITY(int,1,1) INTO #
FROM @TA JOIN @TB ON
[KEA001]=[KEB001]DECLARE @STR NVARCHAR(4000)
SET @STR=N''
SELECT @STR=@STR+N','+N'MAX(CASE WHEN MONTH([KEA003])='+RTRIM(M)+N' THEN RTRIM([KEA031]) ELSE '''' END) AS ['+RTRIM(M)+N'月份]'
FROM (
SELECT M=1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7 UNION ALL
SELECT 8 UNION ALL
SELECT 9 UNION ALL
SELECT 10 UNION ALL
SELECT 11 UNION ALL
SELECT 12) TEXEC(
N' SELECT * FROM ('+
N' SELECT [KEA004] AS 客户名称,YEAR([KEA003]) AS 年度'+@STR+N',SUM([KEA031]) AS 总计, RTRIM(CAST((SUM([KEA031])*1.0/(SELECT SUM([KEA031]) FROM # WHERE YEAR([KEA003])=YEAR(TA.[KEA003]))) AS NUMERIC(4,2))*100)+''%'' AS 比率'+
N' FROM # AS TA GROUP BY [KEA004],YEAR([KEA003]) '+
N' ) TB ORDER BY 年度,总计 DESC')DROP TABLE #
/*
客户a 2008 100 100 67.00%
客户b 2008 50 50 33.00%
客户b 2009 100 100 300 60.00%
客户a 2009 50 50 200 40.00%
*/
INSERT @TA
SELECT '20081230001', '20081230', N'客户a' UNION ALL
SELECT '20081230002', '20081230', N'客户b' UNION ALL
SELECT '20090101001', '20090101', N'客户a' UNION ALL
SELECT '20090102001', '20090102', N'客户b' UNION ALL
SELECT '20090103001', '20090103', N'客户a' UNION ALL
SELECT '20090104001', '20090104', N'客户b' UNION ALL
SELECT '20090201001', '20090201', N'客户a' UNION ALL
SELECT '20090202001', '20090202', N'客户b'DECLARE @TB TABLE([KEB001] VARCHAR(11), [KEA031] INT)
INSERT @TB
SELECT '20081230001', 100 UNION ALL
SELECT '20081230002', 50 UNION ALL
SELECT '20090101001', 100 UNION ALL
SELECT '20090102001', 100 UNION ALL
SELECT '20090103001', 50 UNION ALL
SELECT '20090104001', 100 UNION ALL
SELECT '20090201001', 50 UNION ALL
SELECT '20090202001', 100SELECT *,ID=IDENTITY(int,1,1) INTO #
FROM @TA JOIN @TB ON
[KEA001]=[KEB001]DECLARE @STR NVARCHAR(4000)
SET @STR=N''
SELECT @STR=@STR+N','+N'MAX(CASE WHEN MONTH([KEA003])='+RTRIM(M)+N' THEN RTRIM([KEA031])+N''万'' ELSE '''' END) AS ['+RTRIM(M)+N'月份]'
FROM (
SELECT M=1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7 UNION ALL
SELECT 8 UNION ALL
SELECT 9 UNION ALL
SELECT 10 UNION ALL
SELECT 11 UNION ALL
SELECT 12) TEXEC(
N' SELECT * FROM ('+
N' SELECT [KEA004] AS 客户名称,YEAR([KEA003]) AS 年度'+@STR+N',rtrim(SUM([KEA031]))+N''万'' AS 总计, RTRIM(CAST((SUM([KEA031])*1.0/(SELECT SUM([KEA031]) FROM # WHERE YEAR([KEA003])=YEAR(TA.[KEA003]))) AS NUMERIC(4,2))*100)+''%'' AS 比率'+
N' FROM # AS TA GROUP BY [KEA004],YEAR([KEA003]) '+
N' ) TB ORDER BY 年度,总计 DESC')DROP TABLE #
/*
客户名称 年度 1月份 2月份 3月份 4月份 5月份 6月份 7月份 8月份 9月份 10月份 11月份 12月份 总计 比率
---- ----------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------------------------------------
客户b 2008 50万 50万 33.00%
客户a 2008 100万 100万 67.00%
客户b 2009 100万 100万 300万 60.00%
客户a 2009 50万 50万 200万 40.00%
*/
INSERT @TA
SELECT '20081230001', '20081230', N'客户a' UNION ALL
SELECT '20081230002', '20081230', N'客户b' UNION ALL
SELECT '20090101001', '20090101', N'客户a' UNION ALL
SELECT '20090102001', '20090102', N'客户b' UNION ALL
SELECT '20090103001', '20090103', N'客户a' UNION ALL
SELECT '20090104001', '20090104', N'客户b' UNION ALL
SELECT '20090201001', '20090201', N'客户a' UNION ALL
SELECT '20090202001', '20090202', N'客户b'DECLARE @TB TABLE([KEB001] VARCHAR(11), [KEA031] INT)
INSERT @TB
SELECT '20081230001', 100 UNION ALL
SELECT '20081230002', 50 UNION ALL
SELECT '20090101001', 100 UNION ALL
SELECT '20090102001', 100 UNION ALL
SELECT '20090103001', 50 UNION ALL
SELECT '20090104001', 100 UNION ALL
SELECT '20090201001', 50 UNION ALL
SELECT '20090202001', 100SELECT *,ID=IDENTITY(int,1,1) INTO #
FROM @TA JOIN @TB ON
[KEA001]=[KEB001]DECLARE @STR NVARCHAR(4000)
SET @STR=N''
SELECT @STR=@STR+N','+N'MAX(CASE WHEN MONTH([KEA003])='+RTRIM(M)+N' THEN RTRIM([KEA031])+N''万'' ELSE '''' END) AS ['+RTRIM(M)+N'月份]'
FROM (
SELECT M=1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7 UNION ALL
SELECT 8 UNION ALL
SELECT 9 UNION ALL
SELECT 10 UNION ALL
SELECT 11 UNION ALL
SELECT 12) TEXEC(
N' SELECT 排名=ROW_NUMBER() OVER (PARTITION BY 年度 ORDER BY CAST(LEFT(总计,LEN(总计)-1) AS INT) DESC),* FROM ('+
N' SELECT [KEA004] AS 客户名称,YEAR([KEA003]) AS 年度'+@STR+N',rtrim(SUM([KEA031]))+N''万'' AS 总计, RTRIM(CAST((SUM([KEA031])*1.0/(SELECT SUM([KEA031]) FROM # WHERE YEAR([KEA003])=YEAR(TA.[KEA003]))) AS NUMERIC(4,2))*100)+''%'' AS 比率'+
N' FROM # AS TA GROUP BY [KEA004],YEAR([KEA003]) '+
N' ) TB ORDER BY 年度,CAST(LEFT(总计,LEN(总计)-1) AS INT) DESC')DROP TABLE #
/*
排名 客户名称 年度 1月份 2月份 3月份 4月份 5月份 6月份 7月份 8月份 9月份 10月份 11月份 12月份 总计 比率
-------------------- ---- ----------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------------------------------------
1 客户a 2008 100万 100万 67.00%
2 客户b 2008 50万 50万 33.00%
1 客户b 2009 100万 100万 300万 60.00%
2 客户a 2009 50万 50万 200万 40.00% 200万 40.00%
*/
给个建议.
KEA031(本币税价合计)
不要把单位"万"这些存进去.可以用一个列来存单位.
还有.像这种代码就不用动态的SQL的.列是固定的.
就直接把10个列写出来就可以了..这样可以更好的缓存计划.
动态的SQL,什么缓存计划,不好意思地说……不懂……
嗯,我要好好学习,嘻嘻