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

时间:2013-01-21 20:02:20

标签: mysql sql

任何人都可以通过语法帮我解决这个问题,将数据分成一行,看看分割数据是否再次出现,应该获得分割信息的数量。

如果您看到以下输入表格。 C1有ABC,ACD,BCE等数据。我想将其拆分并计算每个特定数据以及总计数。

MYSQL中的帮助

我在SQL服务器中尝试过的查询:作为一个新的bibe我对MYSQL我能够获得整体数据,但我无法拆分。例如,我知道select C1 from inputtable。但是我无法分析一行在指定列中的数据。

Diagramatical Explanation:

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

2 个答案:

答案 0 :(得分:1)

如果您正在使用固定套装ABCDEFGHIJ,那么这样的事情可能是可行的:

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字符集不匹配时才需要CONVERT ...它是为了避免错误1267非法混合排序。

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

HAVING SUM(1) > 1  

谓词。

答案 1 :(得分:0)

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

如果你必须使用那个,这里有一些丑陋的代码可以帮助你。它会在您的样本输入上生成请求的输出,如tested on SQLFiddle

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

请注意,我绝对不建议你这样写东西。使用适当的数据库模式,您不必重复固定次数。并且还考虑使用单独的查询来获取总数,因为重复结果的每一行都显得毫无意义。