【问题标题】:How to count the number of times two values appear in two columns in any order如何计算两个值以任意顺序出现在两列中的次数
【发布时间】:2015-09-18 04:34:08
【问题描述】:

比方说,我们有这张桌子:

+------+------+
| COL1 | COL2 |
+------+------+
|   A  |   B  |
+------+------+
|   B  |   A  |
+------+------+
|   C  |   D  |
+------+------+

我想计算letter1, letter2letter2, letter1 在这两列中出现的次数。

我想要结果:

+------+------+------+
| COL1 | COL2 | COL3 |
+------+------+------+
|   A  |   B  |   2  | 
+------+------+------+
|   C  |   D  |   1  |
+------+------+------+

注意: 可以是ABBA 都没有关系。

我试过了:

SELECT
COL1,COL1,COUNT(*) AS COL3
FROM
X
GROUP BY COL1,COL2;

但这让我明白了:

+------+------+------+
| COL1 | COL2 | COL3 |
+------+------+------+
|   A  |   B  |   1  |
+------+------+------+
|   B  |   A  |   1  |
+------+------+------+
|   C  |   D  |   1  |
+------+------+------+

【问题讨论】:

  • 使用“协方差矩阵”可以实现类似的效果。然而,结果仍然需要合并 - 分别相加。

标签: mysql sql database count


【解决方案1】:

如果需要,您可以通过交换列来做到这一点:

SELECT Col1, Col2, COUNT(*)
FROM
(
    SELECT
        CASE WHEN Col1 < Col2 THEN Col1 ELSE Col2 END AS Col1,
        CASE WHEN Col1 < Col2 THEN Col2 ELSE Col1 END AS Col2
    FROM T
) t
GROUP BY Col1, Col2

Fiddle

【讨论】:

  • 您可以使用LEASTGREATEST 使其更优雅,并摆脱外部查询,例如this。为一个不错的查询 +1。
  • @GiorgosBetsos - 如果可能,我更喜欢编写适用于所有平台的 SQL。
【解决方案2】:

再试一次

SELECT LEAST(col1, col2) col11, GREATEST(col1, col2) col12 , COUNT(1) FROM X
GROUP BY col11, col12

SqlFiddle

【讨论】:

  • 我最喜欢这个答案。它更短,更易读。
【解决方案3】:

更新::使用@Damien 的答案。再试一次。

你可以试试下面的代码。 Fiddle

   SELECT COL1, COL2,  COUNT(*) AS COL3
   FROM (
    SELECT
    LEAST(COL1,COL2) AS COL1,
    GREATEST(COL1,COL2)  AS COL2
    FROM X
     ) AS Temp
    GROUP BY COL1,COL2;

【讨论】:

  • CTE 是特定于 SQL Server 的。 msdn.microsoft.com/en-us/library/ms190766.aspx
  • @rurouni88 - 它不是特定于 SQL Server 的。它是标准 SQL(Oracle 和 Postgre 也支持它)。只是这里的 MySQL 没有遵循标准。
  • 如果 OP 有不同的数据,您的查询似乎是错误的。看到这个fiddle
  • 您需要 LEAST()GREATEST(),而不是 MIN 和 MAX。
  • @sudhAnsu63 您可能需要为您的字段提供不同的别名。目前您的查询没有给出想要的结果。检查你的小提琴本身
【解决方案4】:

http://sqlfiddle.com/#!9/4bd6a/23

使用 if 语句并连接 2 列。

SELECT
  DISTINCT (CONCAT(C1,C2)) AS permutation, COUNT(1)
  FROM (SELECT
    IF(col1<=col2, col1, col2) as C1,
    IF(col2<col1, col1, col2) as C2
  FROM X) AS T
  GROUP BY permutation
;

进一步说明: if 语句只是按 ASCII 值对字符进行排序,因此无论是 'AB' 还是 'BA',它都将始终表示为 'AB'

【讨论】:

  • 这可能适用于一个字符值,但如果实际值是 'AA' 和 'BB' 这将错误地匹配 'AAB' 和 'B'。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多