1

我有一个表,它的搜索值可能位于两列之一,即 B 列和/或 C 列。我想根据 A 列生成一个摘要,显示所选搜索值(例如 x)出现在每个人的任一列。我想计算两列的总数。

+--------+------+----+
|  name  | B    | C  |
+--------+------+----+ 
| john   | x    | z  |
| john   | x    | x  |
| john   | y    | x  |
| peter  | x    | z  |
| peter  | x    | z  |
| amanda | x    | x  |
| amanda | x    | x  |
| amanda | x    | x  |
| amanda | x    | y  |
| amanda | x    | y  |
+--------+-----------+

在上面的示例中,假设我的搜索值为 x,我想计算 x 在 B 列和/或 C 列中每个人出现的次数。我还想产生总计,并产生以下输出:

Name   B  C

john   2  2
peter  2  0
amanda 5  3
total  9  5

我可以像这样单独为每一列执行此操作:

     SELECT name, COUNT(*) as count FROM table 
          WHERE A = 'x'
          GROUP BY name
          ORDER BY count DESC";

     SELECT name, COUNT(*) as count FROM table 
          WHERE B = 'x'
          GROUP BY name
          ORDER BY count DESC";

然后我可以循环对每个输出进行单独的提取并将它们组合起来,但是我想知道是否有一种方法可以在一个 mysql 语句中对两列进行检查和计数?

4

5 回答 5

2

如果您想要分别计算每列的总和,则可以使用以下命令(SQL Fiddle):

(
  SELECT MTA.Name, Sum(MTA.B = 'x') AS BSum, Sum(MTA.C = 'x') AS CSum
  FROM MyTable MTA
  GROUP BY MTA.Name
)
UNION
(
  SELECT 'Total' AS name, Sum(MTB.B = 'x') AS BSum, Sum(MTB.C = 'x') AS CSum
  FROM MyTable AS MTB
)

或者,如果您想要合并两列的总和,那么您可以执行以下操作(SQL Fiddle):

(
  SELECT MTA.Name, Sum(MTA.B = 'x') + Sum(MTA.C = 'x') AS PersonTotal
  FROM MyTable MTA
  GROUP BY MTA.Name
)
UNION
(
  SELECT 'Total' AS name, Sum(MTB.B = 'x') + Sum(MTB.C = 'x') AS PersonTotal
  FROM MyTable AS MTB
)
于 2013-10-23T02:35:50.100 回答
1
select...
case count (when A = 'x' then A else null) end,
case count (when B = 'x' then B else null) end
...

编辑:哎呀,忽略了计数...

于 2013-10-23T02:30:20.070 回答
1
SELECT name, 
COUNT(CASE WHEN B='x' THEN 1 ELSE 0 END) as B,
COUNT(CASE WHEN C='x' THEN 1 ELSE 0 END) as C FROM table 
GROUP BY name;
于 2013-10-23T02:32:15.847 回答
1
SELECT name, sum(if(B='x',1,0)) as c1, sum(if(C='x',1,0)) as c2FROM table 
WHERE A = 'x'
GROUP BY name
ORDER BY c1 desc, c2 desc
于 2013-10-23T02:32:38.473 回答
1

MySQL 快捷方式,

SELECT Name,
       SUM(B='x') TotalX,
       SUM(C='x') TotalY
FROM   TableName
GROUP  BY Name
于 2013-10-23T02:35:21.220 回答