我遇到了这个SQL的问题:
$sql = mysql_query("SELECT $menucompare ,
(COUNT($menucompare ) * 100 / (SELECT COUNT( $menucompare )
FROM data WHERE $ww = $button )) AS percentday FROM data WHERE $ww >0 ");
$menucompare
是表字段名称选择的字段,包含数据$button
是选择的周数(比如说'6'周)$ww
表格字段名称,其中包含行数为“6”的行例如,我在$menucompare
中有数据:
123456bool
521478bool
122555heel
147788itoo
我希望选择那些在最后一个数据中有相同单词并创造百分比的人。
输出应该是这样的:
50%
(2个条目)25%
(1条)25%
(1条)对我的SQL的任何清晰都将非常感激。 我没有找到类似的东西。
答案 0 :(得分:3)
好吧,以这种格式保存数据可能不是最好的方法,如果可能的话,将字段分成两个单独的字段。
首先,您需要从字段末尾提取字符串部分。
我假设,数字部分是固定的:
SELECT s.str, CAST(count(s.str) AS decimal) / t.cnt * 100 AS pct
FROM (SELECT substr(entry, 7) AS str FROM data) AS s
JOIN (SELECT count(*) AS cnt FROM data) AS t ON 1=1
GROUP BY s.str, t.cnt;
如果您具有regexp_replace
功能,则应将substr(entry, 7)
替换为regexp_replace(entry, '^[0-9]*', '')
以获得所需的结果。
可以测试substr
的变体here。
答案 1 :(得分:2)
在解决这样的问题时,我会分两步完成:
由于这个问题被标记为'SQL',我只会解决第一个问题。
第一步是整理查询:
SELECT menucompare,
(COUNT(menucompare) * 100 / (SELECT COUNT(menucompare) FROM data WHERE ww = 6))
AS percentday
FROM data
WHERE ww > 0;
这将从大多数变量位中删除$
符号,并将6替换为按钮值。这使得理解起来更容易一些。
您想要的输出似乎需要menucompare
中保存的字符串的最后四个字符才能进行分组和计数。
要聚合的数据将通过以下方式选择:
SELECT SUBSTR(MenuCompare, -4) AS Last4
FROM Data
WHERE ww = 6
百分比中的除数是这些行的计数,但是不需要子字符串来计算它们,所以我们可以写:
SELECT COUNT(*) FROM Data WHERE ww = 6
这正是你所拥有的。
百分比中的divdend将是每个子字符串的组计数。
SELECT Last4, COUNT(Last4) * 100.0 / (SELECT COUNT(*) FROM Data WHERE ww = 6)
FROM (SELECT SUBSTR(MenuCompare, -4) AS Last4
FROM Data
WHERE ww = 6
) AS Week6
GROUP BY Last4
ORDER BY Last4;
当您证明这是有效的时,您可以重新参数化查询并处理结果的呈现。