首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用MYSQL从行中分离数据并对每个数据进行计数

如何使用MYSQL从行中分离数据并对每个数据进行计数
EN

Stack Overflow用户
提问于 2013-01-22 04:02:20
回答 2查看 142关注 0票数 0

有没有人能帮我找出一个语法,将数据拆分成一行,看看拆分的数据是否再次出现,应该获得拆分的信息的计数。

如果你看到下面的输入表。C1有像ABC,ACD,BCE这样的数据。我想拆分它,并对每个特定数据和总计数进行计数。

MYSQL中的帮助是值得感谢的

我在SQL server中尝试过的查询:作为MYSQL的新用户,我可以获得整个数据,但我无法拆分。例如,我认识select C1 from inputtable。但是我不知道如何拆分一行在指定列中的数据。

图解说明:

代码语言:javascript
复制
Input Table:

C1        
----------
ABC 
ACD
BCE
NULL
A

Output Table:

Column1            Count            TotalCount
------------------------------------------------------
A                  3                  4
B                  2                  4
C                  3                  4
D                  1                  4
E                  1                  4
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-22 04:29:49

将数据拆分成任意数量的列将需要存储过程或某种类似的丑陋。拆分成10列是可能的,但将这些列转换为行以便您可以聚合它们将再次需要丑陋的代码。所有这些都表明您的模式可能违反了first normal form:您在单个表“单元格”中存储了多个值。您可以修改该模式,还是必须使用该模式?

如果你必须使用它,这里有一些难看的代码可以帮你入门。它会在样例输入上生成所需的输出,如tested on SQLFiddle

代码语言:javascript
复制
SELECT q1.chr, COUNT(*), q2.cnt
FROM ( SELECT SUBSTR(C1, 1, 1) AS chr FROM tab
       UNION ALL
       SELECT SUBSTR(C1, 2, 1) AS chr FROM tab
       UNION ALL
       SELECT SUBSTR(C1, 3, 1) AS chr FROM tab
     ) AS q1,
     ( SELECT COUNT(C1) AS cnt FROM tab ) AS q2
WHERE q1.chr != ''
GROUP BY q1.chr

请注意,我绝对不会建议您这样写。相反,请使用适当的数据库模式,这样就不必重复固定次数的行。还可以考虑使用单独的查询来获取总数,因为对结果的每一行重复该查询似乎是没有意义的。

票数 0
EN

Stack Overflow用户

发布于 2013-01-22 04:46:05

如果你正在使用一个固定的集合ABCDEFGHIJ,那么像这样的东西可能是可行的:

代码语言:javascript
复制
SELECT a.l         AS `Column1`
     , SUM(1)      AS `Count`
     , c.cnt       AS `TotalCount`
  FROM (
         SELECT CONVERT('A' USING latin1) AS l UNION ALL SELECT 'B'  
          UNION ALL SELECT 'C' UNION ALL SELECT 'D'
          UNION ALL SELECT 'E' UNION ALL SELECT 'F'
          UNION ALL SELECT 'G' UNION ALL SELECT 'H'
          UNION ALL SELECT 'I' UNION ALL SELECT 'J'
       ) a
  JOIN input_table t
    ON INSTR(t.c1,a.l)
 CROSS
  JOIN (SELECT COUNT(1) AS cnt FROM input_table) c
 GROUP BY a.l
 ORDER BY a.l

注意:只有当客户端字符集与列c1字符集不匹配时,才需要进行转换...这样做是为了避免错误1267非法的排序规则混合。

如果您想省略计数为0的行(就像所选的答案一样),那么您可以添加一个

代码语言:javascript
复制
HAVING SUM(1) > 1  

谓词。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14446290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档