下次不贴建表语句就不写了.看到中文字段名就烦.呵呵.CREATE TABLE tb(运营商 VARCHAR(10), 缴费类型 VARCHAR(10), 缴费数 INT, 缴费金额 INT) INSERT Tb SELECT '移动' , '类型1' , 225, 6750 UNION ALL SELECT NULL, '类型2', 180 , 8950 UNION ALL SELECT NULL, '类型3', 123 , 12200 UNION ALL SELECT '联通', '类型1', 171 , 5040 UNION ALL SELECT NULL, '类型2' , 102, 4900 UNION ALL SELECT NULL, '类型3' , 38, 3800SELECT *,IDENTITY(int) ID INTO #t FROM tb SELECT * FROM #tSELECT MAX(运营商) 运营商,SUM(缴费数) 运营数,SUM(缴费金额) 运营金额 FROM (SELECT *,GID=CASE ISNULL(运营商,'') WHEN '' THEN (SELECT MAX(ID) FROM #t b WHERE b.ID<a.ID AND b.运营商 IS NOT NULL) ELSE a.ID END FROM #t a) x GROUP BY GIDDROP TABLE tb,#t
楼主, 你是要 Happyboy_zjy(阳光男孩) 的结果反转显示还是什么, 比如行变列,列变行
一般应该是这样的 ------------------------- CREATE TABLE tb(运营商 VARCHAR(10), 缴费类型 VARCHAR(10), 缴费数 INT, 缴费金额 INT) INSERT Tb SELECT '移动' , '类型1' , 225, 6750 UNION ALL SELECT '移动' , '类型2', 180 , 8950 UNION ALL SELECT '移动' , '类型3', 123 , 12200 UNION ALL SELECT '联通', '类型1', 171 , 5040 UNION ALL SELECT '联通', '类型2' , 102, 4900 UNION ALL SELECT '联通', '类型3' , 38, 3800select * from tbselect 运营商,sum(缴费数) as 缴费数,sum(缴费金额) as 缴费金额 from tb group by 运营商drop table tb
CREATE TABLE tb(运营商 VARCHAR(10), 缴费类型 VARCHAR(10), 缴费数 INT, 缴费金额 INT) INSERT Tb SELECT '移动' , '类型1' , 225, 6750 UNION ALL SELECT '移动' , '类型2', 180 , 8950 UNION ALL SELECT '移动' , '类型3', 123 , 12200 UNION ALL SELECT '联通', '类型1', 171 , 5040 UNION ALL SELECT '联通', '类型2' , 102, 4900 UNION ALL SELECT '联通', '类型3' , 38, 3800select * from tbselect 运营商,sum(缴费数) as 缴费数,sum(缴费金额) as 缴费金额 from tb group by 运营商--这样是不好的 select '移动' as [移动],'联通' as 联通, 移动缴费数=(select sum(缴费数) from tb where 运营商='移动'), 联通缴费数=(select sum(缴费数) from tb where 运营商='联通'), 移动缴费金额=(select sum(缴费金额) from tb where 运营商='移动'), 联通缴费金额=(select sum(缴费金额) from tb where 运营商='联通')drop table tb
嘻嘻, 如果真是我所说, 根据业务需求, 我用死一点的方法也可以解决问题~~select (case when 缴费类型='类型1' then 运营商 else '' end) 运营商, 缴费类型, 缴费数, 缴费金额, (case when 缴费类型='类型1' then rtrim(convert(char(20),运营数)) else '' end) 运营数, (case when 缴费类型='类型1' then rtrim(convert(char(20),运营金额)) else '' end) 运营金额 from 运营
在查询后面 用 with rollup 就可实现统计.然后将结果写入一个表中,将不是第一行的的多余信息删除 再显示
CREATE TABLE tb(运营商 VARCHAR(10), 缴费类型 VARCHAR(10), 缴费数 INT, 缴费金额 INT) INSERT Tb SELECT '移动' , '类型1' , 225, 6750 UNION ALL SELECT NULL, '类型2', 180 , 8950 UNION ALL SELECT NULL, '类型3', 123 , 12200 UNION ALL SELECT '联通', '类型1', 171 , 5040 UNION ALL SELECT NULL, '类型2' , 102, 4900 UNION ALL SELECT NULL, '类型3' , 38, 3800SELECT *,IDENTITY(int) ID INTO #t FROM tbSELECT a.运营商,缴费类型,缴费数,缴费金额,运营数,运营金额 FROM #t a LEFT JOIN (SELECT MAX(运营商) 运营商,SUM(缴费数) 运营数,SUM(缴费金额) 运营金额 FROM (SELECT *,GID=CASE ISNULL(运营商,'') WHEN '' THEN (SELECT MAX(ID) FROM #t b WHERE b.ID<a.ID AND b.运营商 IS NOT NULL) ELSE a.ID END FROM #t a) x GROUP BY GID ) b ON a.运营商=b.运营商运营商 缴费类型 缴费数 缴费金额 运营数 运营金额 ---------- ---------- ----------- ----------- ----------- ----------- 移动 类型1 225 6750 528 27900 NULL 类型2 180 8950 NULL NULL NULL 类型3 123 12200 NULL NULL 联通 类型1 171 5040 311 13740 NULL 类型2 102 4900 NULL NULL NULL 类型3 38 3800 NULL NULL(所影响的行数为 6 行)SELECT ISNULL(a.运营商,''),缴费类型,缴费数,缴费金额,ISNULL(运营数,''),ISNULL(运营金额,'') FROM #t a LEFT JOIN (SELECT MAX(运营商) 运营商,SUM(缴费数) 运营数,SUM(缴费金额) 运营金额 FROM (SELECT *,GID=CASE ISNULL(运营商,'') WHEN '' THEN (SELECT MAX(ID) FROM #t b WHERE b.ID<a.ID AND b.运营商 IS NOT NULL) ELSE a.ID END FROM #t a) x GROUP BY GID ) b ON a.运营商=b.运营商 缴费类型 缴费数 缴费金额 ---------- ---------- ----------- ----------- ----------- ----------- 移动 类型1 225 6750 528 27900 类型2 180 8950 0 0 类型3 123 12200 0 0 联通 类型1 171 5040 311 13740 类型2 102 4900 0 0 类型3 38 3800 0 0(所影响的行数为 6 行)DROP TABLE tb,#t 你自己选择看那个效果更适合你。
INSERT Tb SELECT '移动' , '类型1' , 225, 6750
UNION ALL SELECT NULL, '类型2', 180 , 8950
UNION ALL SELECT NULL, '类型3', 123 , 12200
UNION ALL SELECT '联通', '类型1', 171 , 5040
UNION ALL SELECT NULL, '类型2' , 102, 4900
UNION ALL SELECT NULL, '类型3' , 38, 3800SELECT *,IDENTITY(int) ID INTO #t FROM tb
SELECT * FROM #tSELECT MAX(运营商) 运营商,SUM(缴费数) 运营数,SUM(缴费金额) 运营金额 FROM
(SELECT *,GID=CASE ISNULL(运营商,'') WHEN '' THEN
(SELECT MAX(ID) FROM #t b WHERE b.ID<a.ID AND b.运营商 IS NOT NULL)
ELSE a.ID END
FROM #t a) x
GROUP BY GIDDROP TABLE tb,#t
-------------------------
CREATE TABLE tb(运营商 VARCHAR(10), 缴费类型 VARCHAR(10), 缴费数 INT, 缴费金额 INT)
INSERT Tb SELECT '移动' , '类型1' , 225, 6750
UNION ALL SELECT '移动' , '类型2', 180 , 8950
UNION ALL SELECT '移动' , '类型3', 123 , 12200
UNION ALL SELECT '联通', '类型1', 171 , 5040
UNION ALL SELECT '联通', '类型2' , 102, 4900
UNION ALL SELECT '联通', '类型3' , 38, 3800select * from tbselect 运营商,sum(缴费数) as 缴费数,sum(缴费金额) as 缴费金额
from tb
group by 运营商drop table tb
CREATE TABLE tb(运营商 VARCHAR(10), 缴费类型 VARCHAR(10), 缴费数 INT, 缴费金额 INT)
INSERT Tb SELECT '移动' , '类型1' , 225, 6750
UNION ALL SELECT '移动' , '类型2', 180 , 8950
UNION ALL SELECT '移动' , '类型3', 123 , 12200
UNION ALL SELECT '联通', '类型1', 171 , 5040
UNION ALL SELECT '联通', '类型2' , 102, 4900
UNION ALL SELECT '联通', '类型3' , 38, 3800select * from tbselect 运营商,sum(缴费数) as 缴费数,sum(缴费金额) as 缴费金额
from tb
group by 运营商--这样是不好的
select '移动' as [移动],'联通' as 联通,
移动缴费数=(select sum(缴费数) from tb where 运营商='移动'),
联通缴费数=(select sum(缴费数) from tb where 运营商='联通'),
移动缴费金额=(select sum(缴费金额) from tb where 运营商='移动'),
联通缴费金额=(select sum(缴费金额) from tb where 运营商='联通')drop table tb
写法是类似的.
按运营商来分,只要记录不是同一组的第一条(IDENTITY(int)生成的ID 当前记录ID不是同运营商记录最小ID),刚将三个字段的显示置为NULL.懒得写了.
(case when 缴费类型='类型1' then 运营商 else '' end) 运营商,
缴费类型,
缴费数,
缴费金额,
(case when 缴费类型='类型1' then rtrim(convert(char(20),运营数)) else '' end) 运营数,
(case when 缴费类型='类型1' then rtrim(convert(char(20),运营金额)) else '' end) 运营金额
from 运营
INSERT Tb SELECT '移动' , '类型1' , 225, 6750
UNION ALL SELECT NULL, '类型2', 180 , 8950
UNION ALL SELECT NULL, '类型3', 123 , 12200
UNION ALL SELECT '联通', '类型1', 171 , 5040
UNION ALL SELECT NULL, '类型2' , 102, 4900
UNION ALL SELECT NULL, '类型3' , 38, 3800SELECT *,IDENTITY(int) ID INTO #t FROM tbSELECT a.运营商,缴费类型,缴费数,缴费金额,运营数,运营金额
FROM #t a
LEFT JOIN (SELECT MAX(运营商) 运营商,SUM(缴费数) 运营数,SUM(缴费金额) 运营金额 FROM
(SELECT *,GID=CASE ISNULL(运营商,'') WHEN '' THEN
(SELECT MAX(ID) FROM #t b WHERE b.ID<a.ID AND b.运营商 IS NOT NULL)
ELSE a.ID END
FROM #t a) x
GROUP BY GID
) b
ON a.运营商=b.运营商运营商 缴费类型 缴费数 缴费金额 运营数 运营金额
---------- ---------- ----------- ----------- ----------- -----------
移动 类型1 225 6750 528 27900
NULL 类型2 180 8950 NULL NULL
NULL 类型3 123 12200 NULL NULL
联通 类型1 171 5040 311 13740
NULL 类型2 102 4900 NULL NULL
NULL 类型3 38 3800 NULL NULL(所影响的行数为 6 行)SELECT ISNULL(a.运营商,''),缴费类型,缴费数,缴费金额,ISNULL(运营数,''),ISNULL(运营金额,'')
FROM #t a
LEFT JOIN (SELECT MAX(运营商) 运营商,SUM(缴费数) 运营数,SUM(缴费金额) 运营金额 FROM
(SELECT *,GID=CASE ISNULL(运营商,'') WHEN '' THEN
(SELECT MAX(ID) FROM #t b WHERE b.ID<a.ID AND b.运营商 IS NOT NULL)
ELSE a.ID END
FROM #t a) x
GROUP BY GID
) b
ON a.运营商=b.运营商 缴费类型 缴费数 缴费金额
---------- ---------- ----------- ----------- ----------- -----------
移动 类型1 225 6750 528 27900
类型2 180 8950 0 0
类型3 123 12200 0 0
联通 类型1 171 5040 311 13740
类型2 102 4900 0 0
类型3 38 3800 0 0(所影响的行数为 6 行)DROP TABLE tb,#t
你自己选择看那个效果更适合你。