SQL在循环中获取聚合功能的列名

时间:2019-04-24 06:28:30

标签: mysql sql loops

让它变得简单:我需要计算表中所有列的数量。是否可以遍历表名,而不是为每列(如果有> 20列)都键入每个COUNT(column_name)

 SELECT COUNT(column_1) AS column_1,
        COUNT(column_2) AS column_2,
        COUNT(column_3) AS column_3,
        COUNT(column_4) AS column_4
 FROM table

很高兴知道一个通​​用原理,该原理不仅可以应用于COUNT(),而且还可以应用于其他情况。

3 个答案:

答案 0 :(得分:2)

您可以在存储过程中使用动态SQL创建查询。您可以从INFORMATION_SCHEMA.COLUMNS表中获得列名。

SET @cols = (
    SELECT GROUP_CONCAT('COUNT(`', column_name, '`) AS `', column_name, '`'))
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'table');
PREPARE @stmt FROM CONCAT('SELECT ', @cols, ' FROM table');
EXECUTE @stmt;

答案 1 :(得分:1)

您可以使用INFORMATION_SCHEMA.COLUMNS获取表的所有列名称。然后,您可以使用procedureanonymous block遍历所有列,并将结果存储在某个变量中或插入到某个表中

CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT FALSE;


  DECLARE col_names CURSOR FOR 
      SELECT column_name
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE table_name = 'tbl_name'
      ORDER BY ordinal_position;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN col_names;


  read_loop: LOOP
    FETCH col_names INTO my_col;
    IF done THEN
      LEAVE read_loop;
    END IF;

    --Your Operation goes here 
    --select count(mycol) insert into  yourtab

  END LOOP;

  CLOSE cur1;

END; 

答案 2 :(得分:0)

我不太确定你的意思。 COUNT()返回记录数,并且表中的每一列都相同。一排就是一排。

您要查询的表中的列数是多少?如果是这样,一种方法是像这样使用INFORMATION_SCHEMA.COLUMNS:

SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'your_table_name'