sql中怎么求多行多列的和

时间:2021-11-29 00:56:32
假如我现在有一个表
id   a      b     c        sex
1    2      3      4        男
2    1       2      3       女
3    1      2        4      男
查询结果
                  1       9
男    16
                  3        7

女      6    2            6

没分了 求各位大哥帮忙

13 个解决方案

#1


说一下计算规则。

#2


sql中怎么求多行多列的和

我要的类似于这种效果

我现在查出来的就是
男 9 1 9
男 7 3 7
女 6 2 6 

#3


你想要的结果是这样吗?
男 16 1 9
男 16 3 7
女 6 2 6 

#4


3L说的这种的应该也是可以的

#5


语句:
;WITH tab1(id,a,b,c,sex)AS(
select 1,2,3,4,'男'  union all 
select 2,1,2,3,'女'  union all 
select 3,1,2,4,'男'   
)
SELECT  a.sex ,
        ( SELECT    SUM(a + b + c)
          FROM      tab1 b
          WHERE     a.sex = b.sex
        ) AS 总量 ,
        a.id ,
        SUM(a.a + a.b + a.c) AS 行总量
FROM    tab1 a
GROUP BY a.sex ,
        a.id
ORDER BY a.sex



结果:
sql中怎么求多行多列的和





#6


不要在返回字段中嵌套子查询,可以汇总后和明细连接。
WITH
/* 测试数据
table1(id,a,b,c,sex) AS (
    SELECT 1,2,3,4,'男' UNION ALL 
    SELECT 2,1,2,3,'女' UNION ALL 
    SELECT 3,1,2,4,'男'  
),
 */
x(性别,总量) AS (
    SELECT sex,
           SUM(a+b+c)
      FROM table1
  GROUP BY sex
)
SELECT x.性别,
       x.总量,
       y.id,
       y.a+y.b+y.c 行总量
  FROM x
  JOIN table1 y
    ON x.性别 = y.sex

性别        总量          id      行总量
---- ----------- ----------- -----------
男            16           3           7
男            16           1           9
女             6           2           6

#7


谢谢大家,第一种我试了下.可以 但是速度太慢不知道是我数据太大还是怎么回事.第二种方法提示我性别附件语法错误,不知道怎么回事

#8


你试试这样快点么?
;WITH tab1(id,a,b,c,sex)AS(
select 1,2,3,4,'男'  union all 
select 2,1,2,3,'女'  union all 
select 3,1,2,4,'男'   
)
SELECT  a.sex ,
        t.总量 AS 总量 ,
        a.id ,
        SUM(a.a + a.b + a.c) AS 行总量
FROM    tab1 a
        INNER JOIN ( SELECT b.sex ,
                            SUM(a + b + c) AS 总量
                     FROM   tab1 b
                     GROUP BY b.sex
                   ) t ON a.sex = t.sex
GROUP BY a.sex ,
        t.总量 ,
        a.id
ORDER BY a.sex

#9


看了6楼的,又改进点了点
;WITH tab1(id,a,b,c,sex)AS(
select 1,2,3,4,'男'  union all 
select 2,1,2,3,'女'  union all 
select 3,1,2,4,'男'   
)
SELECT  a.sex ,
        t.总量 AS 总量 ,
        a.id ,
        (a.a + a.b + a.c) AS 行总量
FROM    tab1 a
        INNER JOIN ( SELECT b.sex ,
                            SUM(a + b + c) AS 总量
                     FROM   tab1 b
                     GROUP BY b.sex
                   ) t ON a.sex = t.sex
ORDER BY a.sex

#10


引用 7 楼 qq_37147428 的回复:
第二种方法提示我性别附件语法错误,不知道怎么回事 

你漏了 WITH 关键字?
在多条语句中 WITH 前面加分号。

#11


10楼的 那个是对的 我忘记加了  9楼大哥的怎么报select附近语句错误了

#12


引用 11 楼 qq_37147428 的回复:
10楼的 那个是对的 我忘记加了  9楼大哥的怎么报select附近语句错误了
没有啊

#13



WITH T1(id,a,b,c,sex) AS (
    SELECT 1,2,3,4,'男' UNION ALL 
    SELECT 2,1,2,3,'女' UNION ALL 
    SELECT 3,1,2,4,'男'  
),T2 As
(
Select id,sex,sum(a+b+c) as c1 from T1 group by id,sex
),T3 As
(
Select sex,sum(a+b+c) as c2 from T1 group by sex
)
Select a.id,a.c1,b.c2,a.sex from T2 a join T3 b on a.sex=b.sex

#1


说一下计算规则。

#2


sql中怎么求多行多列的和

我要的类似于这种效果

我现在查出来的就是
男 9 1 9
男 7 3 7
女 6 2 6 

#3


你想要的结果是这样吗?
男 16 1 9
男 16 3 7
女 6 2 6 

#4


3L说的这种的应该也是可以的

#5


语句:
;WITH tab1(id,a,b,c,sex)AS(
select 1,2,3,4,'男'  union all 
select 2,1,2,3,'女'  union all 
select 3,1,2,4,'男'   
)
SELECT  a.sex ,
        ( SELECT    SUM(a + b + c)
          FROM      tab1 b
          WHERE     a.sex = b.sex
        ) AS 总量 ,
        a.id ,
        SUM(a.a + a.b + a.c) AS 行总量
FROM    tab1 a
GROUP BY a.sex ,
        a.id
ORDER BY a.sex



结果:
sql中怎么求多行多列的和





#6


不要在返回字段中嵌套子查询,可以汇总后和明细连接。
WITH
/* 测试数据
table1(id,a,b,c,sex) AS (
    SELECT 1,2,3,4,'男' UNION ALL 
    SELECT 2,1,2,3,'女' UNION ALL 
    SELECT 3,1,2,4,'男'  
),
 */
x(性别,总量) AS (
    SELECT sex,
           SUM(a+b+c)
      FROM table1
  GROUP BY sex
)
SELECT x.性别,
       x.总量,
       y.id,
       y.a+y.b+y.c 行总量
  FROM x
  JOIN table1 y
    ON x.性别 = y.sex

性别        总量          id      行总量
---- ----------- ----------- -----------
男            16           3           7
男            16           1           9
女             6           2           6

#7


谢谢大家,第一种我试了下.可以 但是速度太慢不知道是我数据太大还是怎么回事.第二种方法提示我性别附件语法错误,不知道怎么回事

#8


你试试这样快点么?
;WITH tab1(id,a,b,c,sex)AS(
select 1,2,3,4,'男'  union all 
select 2,1,2,3,'女'  union all 
select 3,1,2,4,'男'   
)
SELECT  a.sex ,
        t.总量 AS 总量 ,
        a.id ,
        SUM(a.a + a.b + a.c) AS 行总量
FROM    tab1 a
        INNER JOIN ( SELECT b.sex ,
                            SUM(a + b + c) AS 总量
                     FROM   tab1 b
                     GROUP BY b.sex
                   ) t ON a.sex = t.sex
GROUP BY a.sex ,
        t.总量 ,
        a.id
ORDER BY a.sex

#9


看了6楼的,又改进点了点
;WITH tab1(id,a,b,c,sex)AS(
select 1,2,3,4,'男'  union all 
select 2,1,2,3,'女'  union all 
select 3,1,2,4,'男'   
)
SELECT  a.sex ,
        t.总量 AS 总量 ,
        a.id ,
        (a.a + a.b + a.c) AS 行总量
FROM    tab1 a
        INNER JOIN ( SELECT b.sex ,
                            SUM(a + b + c) AS 总量
                     FROM   tab1 b
                     GROUP BY b.sex
                   ) t ON a.sex = t.sex
ORDER BY a.sex

#10


引用 7 楼 qq_37147428 的回复:
第二种方法提示我性别附件语法错误,不知道怎么回事 

你漏了 WITH 关键字?
在多条语句中 WITH 前面加分号。

#11


10楼的 那个是对的 我忘记加了  9楼大哥的怎么报select附近语句错误了

#12


引用 11 楼 qq_37147428 的回复:
10楼的 那个是对的 我忘记加了  9楼大哥的怎么报select附近语句错误了
没有啊

#13



WITH T1(id,a,b,c,sex) AS (
    SELECT 1,2,3,4,'男' UNION ALL 
    SELECT 2,1,2,3,'女' UNION ALL 
    SELECT 3,1,2,4,'男'  
),T2 As
(
Select id,sex,sum(a+b+c) as c1 from T1 group by id,sex
),T3 As
(
Select sex,sum(a+b+c) as c2 from T1 group by sex
)
Select a.id,a.c1,b.c2,a.sex from T2 a join T3 b on a.sex=b.sex