select 运营商,sum(缴费数) as 运营数,sum(缴费金额) as 运营金额
from tablename
group by 运营商

解决方案 »

  1.   

    下次不贴建表语句就不写了.看到中文字段名就烦.呵呵.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
      

  2.   

    楼主, 你是要 Happyboy_zjy(阳光男孩) 的结果反转显示还是什么, 比如行变列,列变行
      

  3.   

    一般应该是这样的
    -------------------------
    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
      

  4.   


    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
      

  5.   

    我晕,那又要打这么多汉字来写测试数据.算了这20分我不蹭了.
    写法是类似的.
    按运营商来分,只要记录不是同一组的第一条(IDENTITY(int)生成的ID 当前记录ID不是同运营商记录最小ID),刚将三个字段的显示置为NULL.懒得写了.
      

  6.   

    嘻嘻, 如果真是我所说, 根据业务需求, 我用死一点的方法也可以解决问题~~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 运营
      

  7.   

    在查询后面 用 with rollup  就可实现统计.然后将结果写入一个表中,将不是第一行的的多余信息删除 再显示
      

  8.   

    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
    你自己选择看那个效果更适合你。