3

我有一个表(sql 2008),其中 col1 中的 A、B、C、D、E 值有没有办法获取按 col1 分组的计数,以便返回的结果为

A - #
B - #
other - #

谢谢

4

7 回答 7

6

重复这个CASE表达式是可行的,但我发现只执行一次该表达式并不那么乏味。计划是相同的。

;WITH x AS 
(
  SELECT Name = CASE WHEN Name IN ('A','B') THEN Name 
  ELSE 'Other' END
  FROM dbo.YourTable
)
SELECT Name, COUNT(*) FROM x 
GROUP BY Name;

如果排序很重要(例如Other,应该是结果中的最后一行,即使其他名称按字母顺序排列在其后),那么您可以说:

ORDER BY CASE WHEN Name = 'Other' THEN 1 ELSE 0 END, Name;
于 2013-08-29T19:17:50.250 回答
5
select
   case when col1 in ('a','b') then col1 else 'other' end,
   count(*)
from tab
group by case when col1 in ('a','b') then col1 else 'other' end
于 2013-08-29T19:18:01.880 回答
1
SELECT res.col1, COUNT(*)
FROM
      (SELECT 
      (CASE col1 WHEN 'A' THEN 'A'
                 WHEN 'B' THEN 'B'
                 ELSE 'other'
       END) as col1
       FROM table ) as res
GROUP BY col1

测试

于 2013-08-29T19:19:46.310 回答
0
SELECT CASE col1
WHEN a then 'nameofnewcolumn'
WHEN b then 'nameofnewcolumn'
ELSE 'other'
END
FROM TABLE

这应该将所有值分组到列中,而 else 将不适合 OTHER 组的所有内容分组。

于 2013-08-29T19:14:12.107 回答
0

尝试这个:

SELECT ColumnName, COUNT(ColumnName)
    FROM NyTable
    GROUP BY ColumnName
于 2013-08-29T19:14:23.113 回答
0
SELECT col1, COUNT(col1)
FROM mytable
WHERE col1 IN ('A', 'B')
GROUP BY col1
UNION
SELECT col1, COUNT(col1)
FROM mytable
WHERE col1 IS NULL OR col1 NOT IN ('A','B')
GROUP BY col1
ORDER BY col1
于 2013-08-29T19:13:59.403 回答
0

如果“other”应该是最后一行,而“A”、“B”实际上可以是任意的(例如“plums”、“zillion”),则可以使用以下内容:

;with cte as (
    select
        col1 = case when t.col1 in ('A', 'B') then t.Col1 else 'other' end,
        ordnum = case when t.col1 in ('A', 'B') then 0 else 1 end
    from TableName
)
select col1, count(1)
from cte
group by col1
order by ordnum, col1
于 2013-08-29T19:31:16.477 回答