0

任何人都可以在这里用一种语法来帮助我,将数据连续拆分并查看拆分的数据是否再次出现,应该获得拆分信息的计数。

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

MYSQL 中的帮助表示赞赏

我在 SQL 服务器中尝试过的查询:作为 MYSQL 的新成员,我能够获取整个数据,但我无法拆分。例如,我知道select C1 from inputtable。但我无法理解拆分指定列中某行的数据。

图解说明:

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
4

2 回答 2

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 ......它的存在是为了避免 Error 1267 Illegal mix of collat​​ions。

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

HAVING SUM(1) > 1  

谓词。

于 2013-01-21T20:46:05.060 回答
0

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

如果您必须使用那个,这里有一些丑陋的代码可以帮助您入门。正如在 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

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

于 2013-01-21T20:29:49.290 回答