如何计算数据库表列中的值?
Posted
技术标签:
【中文标题】如何计算数据库表列中的值?【英文标题】:How to count values from the database table column? 【发布时间】:2020-06-04 21:02:20 【问题描述】:我想将找到here的游戏标签数据转换成星型模式的维度表。
但问题是 steamspy_tag_data 表是这样组织的,每列名称都是游戏的标签名称,一个游戏可以有多个标签。例如,假设我有一个 appid 为 30 的游戏 Warcraft3,它会在这样的表格中。
appid|strategy|action|shooter|fantasy|
-----+--------+------+-------+-------
30 6345 1452 0 6340
大于 0 的列值表示将某个游戏选为该游戏标签的用户投票数。对于 appid 30 - 6345 用户投票的 Warcraft3 游戏,它被归类为策略 1452 用户,它被归类为行动,.. 等等。 某些列,例如“抽象”(列)标签在整个列中几乎全为 0,这意味着几乎没有游戏使用该标签,因此为了将超过 29k 行值的 372 列简化为更紧凑的内容,我想运行一个可以计数的查询每个标签列的非零值并将它们放入新表“tagovi”中,以便更好地了解哪些列(标签)的游戏使用次数相对较少。
到目前为止,我想出了这个:
CREATE DEFINER=`root`@`localhost` PROCEDURE `zbroji_tagove`()
BEGIN
DECLARE i INTEGER;
DECLARE total_row_count INTEGER;
DECLARE dummy VARCHAR(255);
DECLARE zbrojeno INTEGER;
DECLARE trenutna VARCHAR(255);
DECLARE kursor CURSOR FOR
SELECT column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_schema = 'sppi' AND table_name = 'steamspy_tag_data'
ORDER BY ordinal_position;
SELECT FOUND_ROWS() into total_row_count;
open kursor;
FETCH kursor into dummy;
SET i = 1;
ponavljanje: LOOP
IF i > total_row_count THEN
CLOSE kursor;
LEAVE ponavljanje;
END IF;
FETCH kursor INTO trenutna;
SET zbrojeno = 0;
SET zbrojeno = (SELECT COUNT(*) FROM steamspy_tag_data where trenutna <> 0);
INSERT INTO tagovi(kategorija,broj_igra)
VALUES (
(trenutna),(zbrojeno)
);
SET i = i + 1;
end LOOP;
END
新表 tagovi 有 3 列(ID auto_increment、kategorija Varchar(255)、broj_igra INTEGER)。
当我执行存储过程“zbroji_tagove”() 时,我得到 SQL ERROR CODE 1292;截断不正确的 DOUBLE 值“some_tag_name”。因此,sql以某种方式将变量值视为值而不是行 SET zbrojeno = (SELECT COUNT() FROM steamspy_tag_data where trenutna 0*);
有没有办法让我在 mysql 环境中完成我想要的?
【问题讨论】:
见meta.***.com/questions/333952/… 【参考方案1】:你不能使用这样的变量,你需要一个准备好的语句
见
@sql = CONCAT("SELECT COUNT(*) INTO zbrojeno FROM steamspy_tag_data where ",trenutna," <> 0);";
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
【讨论】:
以上是关于如何计算数据库表列中的值?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SQL Server 读取 MS Access 数据库以更新一个或多个表列中的数据?
比较 Excel 工作表列数据,然后将数据填充到下一个列(如果有匹配)