如何从数据库表列计算值?

nsc4cvqm  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(559)

我想把这里找到的游戏标签数据转换成星型模式的维度表。
但问题是steamspy\u tag\u数据表是这样组织的,每个列名都是一个游戏的标签名,一个游戏可以有多个标签。例如,假设我有一个appid30的魔兽争霸3游戏,它会在这样一个表中。

  1. appid|strategy|action|shooter|fantasy|
  2. -----+--------+------+-------+-------
  3. 30 6345 1452 0 6340

大于0的列值表示投票给某个游戏的用户票数。对于appid为30-6345的warcraft3游戏,用户投票将其归类为策略,将其归类为动作的用户为1452名。。一些列,例如“abstract”(列)标签在整个列中几乎都是0,这意味着几乎没有游戏使用该标签,因此,为了将372列(行值超过29k)简化为更紧凑的内容,我想运行一个查询,计算每个标记列的非零值,并将它们放入新表“tagovi”中,以便更好地了解哪些列(标记)具有相对较低的游戏使用计数。
到目前为止我想到了这个:

  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `zbroji_tagove`()
  2. BEGIN
  3. DECLARE i INTEGER;
  4. DECLARE total_row_count INTEGER;
  5. DECLARE dummy VARCHAR(255);
  6. DECLARE zbrojeno INTEGER;
  7. DECLARE trenutna VARCHAR(255);
  8. DECLARE kursor CURSOR FOR
  9. SELECT column_name
  10. FROM INFORMATION_SCHEMA.COLUMNS
  11. WHERE table_schema = 'sppi' AND table_name = 'steamspy_tag_data'
  12. ORDER BY ordinal_position;
  13. SELECT FOUND_ROWS() into total_row_count;
  14. open kursor;
  15. FETCH kursor into dummy;
  16. SET i = 1;
  17. ponavljanje: LOOP
  18. IF i > total_row_count THEN
  19. CLOSE kursor;
  20. LEAVE ponavljanje;
  21. END IF;
  22. FETCH kursor INTO trenutna;
  23. SET zbrojeno = 0;
  24. SET zbrojeno = (SELECT COUNT(*) FROM steamspy_tag_data where trenutna <> 0);
  25. INSERT INTO tagovi(kategorija,broj_igra)
  26. VALUES (
  27. (trenutna),(zbrojeno)
  28. );
  29. SET i = i + 1;
  30. end LOOP;
  31. END

新表tagovi有3列(id auto\u increment、kategorija varchar(255)、broj\u igra integer)。
当我执行存储过程“zbroji\u tagove”()时,我得到了sql错误代码1292;截断了不正确的双精度值“some\u tag\u name”。因此,sql以某种方式将变量值视为行集合zbrojeno=(select count()from steamspy\u tag\u data where trenutna<>0*)处的值,而不是列;
有没有一种方法可以让我在mysql环境中实现我想要的?

vlf7wbxs

vlf7wbxs1#

你不能使用这样的变量,你需要一个准备好的语句
看见

  1. @sql = CONCAT("SELECT COUNT(*) INTO zbrojeno FROM steamspy_tag_data where ",trenutna," <> 0);";
  2. PREPARE stmt1 FROM @sql;
  3. EXECUTE stmt1;
  4. DEALLOCATE PREPARE stmt1;

相关问题