【问题标题】:How to get the sum of all columns (large in number) in a seperate column for each row (mysql)?如何在每一行(mysql)的单独列中获取所有列的总和(数量较大)?
【发布时间】:2016-01-20 06:11:59
【问题描述】:

我有一张有 150 多列的大桌子,里面有数字。第一列包含text 值,其余列包含int 值。我想创建一个新列,其中包含每行中所有列的总和值(不包括包含文本的第一列)。我不想在查询中输入每一列的名称,因为我需要输入大约 150 多个列名称。

--------------------------------------------------------
name | physics | chemistry | maths | biology | summation
--------------------------------------------------------
n1   | 10      | 20        | 30    | 50      | 110
--------------------------------------------------------
n2   | 20      | 10        | 40    | 30      | 100
--------------------------------------------------------

这是我的表格的简单布局,这里只有 4 列保存要求和的值。但就我而言,有 150 多列。如示例所示,我想创建新的列总和。

【问题讨论】:

  • I don't want to enter the names of each and every column in the query as I will need to type about 150 + column names 这是您不想这样做的唯一原因吗?写列名有什么问题,直到它是非常不稳定的表结构。您可以描述该表并进入电子表格并在其间添加+ 符号。
  • MySQL 还是 MS SQL Server? (不要标记未涉及的产品...)
  • 列太多,每个主题只有一行。
  • @jarlh 在我的特殊情况下,我需要找到每个科目的总分。如物理-30,化学-30等。所以用列改变行,反之亦然不能解决我的问题。我有大约 7000 行。
  • 您是否尝试将 150+ 列旋转到 150+ 行然后使用 sum 函数?

标签: mysql sql database information-schema


【解决方案1】:

我已经创建了一个测试表:

    CREATE TABLE [dbo].[Table_Test](
        [Name] [nchar](10) NOT NULL,
        [physics] [int] NULL,
        [chemistry] [int] NULL
    ) ON [PRIMARY]

并在其中添加了一些数据。

然后我构建一个动态 SQL 并执行它:

declare  @sql varchar (MAX) = 'select Name, ('
declare  @ColName varchar (20) = ''

DECLARE MY_CURSOR CURSOR 
  LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR 
select  c.COLUMN_NAME  from INFORMATION_SCHEMA.COLUMNS C where C.TABLE_NAME =  'Table_Test' and c.DATA_TYPE = 'int'
OPEN MY_CURSOR

FETCH NEXT FROM MY_CURSOR INTO @ColName
WHILE @@FETCH_STATUS = 0
BEGIN 
   set @Sql  += '"' + @ColName + '" '  + ' + '
    --Do something with Id here
    ---PRINT @PractitionerId
    FETCH NEXT FROM MY_CURSOR INTO @ColName
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR

set @Sql  += '0) as Total from Table_Test '
exec(@sql);
print @sql

--Wanted result
--select name, ("physics" + "chemistry" + 0) as Total from  [dbo].[Table_Test] 

这里是 MYSQL:

DELIMITER //

CREATE PROCEDURE Sums ( )

BEGIN

DECLARE SQlText nvarchar(10000);
DECLARE ColName varchar (20);

DECLARE MY_CURSOR CURSOR FOR
  select  c.COLUMN_NAME  from INFORMATION_SCHEMA.COLUMNS C where C.TABLE_NAME =  'Table_Test' and c.DATA_TYPE = 'int';

open MY_CURSOR;

FETCH MY_CURSOR INTO ColName;

set SQlText = 'select Name, (';

start_loop: loop
  set SQlText =  concat( SQlText , '`' , ColName , '` '  , ' + ');  
  select  concat(SqlText, '0) as Total from Table_Test ') as '';
  FETCH MY_CURSOR INTO ColName;

end loop;

Close MY_CURSOR;

set @SQlText = concat(SqlText, '0) as Total from Table_Test ');
PREPARE stmt FROM @SQlText;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


END; //

DELIMITER ;

【讨论】:

    【解决方案2】:

    你能不能用这个简单的方法试试

    SELECT t.*, SUM( IF(t.physics='',0,t.physics) + IF(t.chemistry='',0,t.chemistry) + ... so on) AS subtotal FROM TableName AS t GROUP BY t.id ORDER BY subtotal DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2021-05-13
      • 1970-01-01
      • 2021-08-13
      相关资源
      最近更新 更多