给定一组布尔列,如何获得具有最多真值的前5列


CREATE TABLE test(
column1 BOOLEAN,
column2 BOOLEAN,
column3 BOOLEAN
);
INSERT INTO test VALUES (true, false, true);
INSERT INTO test VALUES (true, false, true);
INSERT INTO test VALUES (true, false, false);
INSERT INTO test VALUES (true, false, false);
INSERT INTO test VALUES (true, false, true);
INSERT INTO test VALUES (true, false, true);

我正在寻找一个我得到的结果

按降序排列的最大Trues数:第1列、第3列、第2列。具体来说,我需要列的名称。你知道我该怎么做吗?

使用UNION ALL从只有2列的表中获取结果集:每列的名称作为字符串及其值
然后使用两个级别的聚合,并使用GROUP_CONCAT()获得您想要的结果:

SELECT GROUP_CONCAT(name ORDER BY total DESC) result
FROM (
SELECT name, SUM(col) total
FROM (
SELECT 'column1' name, column1 col FROM test
UNION ALL
SELECT 'column2', column2 FROM test
UNION ALL
SELECT 'column3', column3 FROM test
) t
GROUP BY name
) t;

如果您想在不同的行中显示列名:

SELECT name, SUM(col) total
FROM (
SELECT 'column1' name, column1 col FROM test
UNION ALL
SELECT 'column2', column2 FROM test
UNION ALL
SELECT 'column3', column3 FROM test
) t
GROUP BY name
ORDER BY total DESC;

请参阅演示

如果实际上有更多的列,并且您想要前5列的名称,请替换:

GROUP_CONCAT(name ORDER BY total DESC)

带有:

SUBSTRING_INDEX(GROUP_CONCAT(name ORDER BY total DESC), ',', 5) 

和:

ORDER BY total DESC

带有:

ORDER BY total DESC LIMIT 5

最新更新