SQLselect count with case/when

SQLselect count with case/when,sql,sas,proc-sql,Sql,Sas,Proc Sql,我有下表: Id Type 1 A 2 B 3 C 4 A 我想创建一个新表,统计每种类型的行数。为每种类型计数创建每个表很容易,但我希望在外观和性能方面做得更好,所以可以在一个查询中实现这一点吗?我提出了一个如下的查询,但它不起作用。该错误表示“WHEN子句2的结果与前一个结果的数据类型不同”。 感谢您的帮助 PROC SQL; CREATE TABLE WORK.Statistics_Count AS SELECT COUNT(Id) as t

我有下表:

Id  Type 
1   A
2   B
3   C
4   A
我想创建一个新表,统计每种类型的行数。为每种类型计数创建每个表很容易,但我希望在外观和性能方面做得更好,所以可以在一个查询中实现这一点吗?我提出了一个如下的查询,但它不起作用。该错误表示“WHEN子句2的结果与前一个结果的数据类型不同”。 感谢您的帮助

PROC SQL;
   CREATE TABLE WORK.Statistics_Count AS
   SELECT 
      COUNT(Id) as total,
      COUNT(CASE WHEN Type = "A" then Id else . end) as typeA,
      COUNT(CASE WHEN Type = "B" then Id else . end) as typeB,
      COUNT(CASE WHEN Type = "C" then Id else . end) as typeC,
      COUNT(CASE WHEN Type <> "A" then Id else . end) as nonTypeA
   FROM WORK.ListTable;
QUIT; 
PROC-SQL;
创建表WORK.Statistics\u计数为
挑选
将(Id)计为总数,
将(Type=“A”时的大小写,然后是Id else.end)计数为typeA,
将(Type=“B”时为CASE,然后为Id else.end)计数为typeB,
将(Type=“C”时的CASE,然后Id else.end)计数为typeC,
将(键入“A”时的大小写,然后是Id else.end)计数为非类型A
从WORK.ListTable;
退出
尝试以下代码:

Select Type , count(Type) as cnt
from WORK.Statistics_Count
group by Type
根据注释更新代码

    Select Type, count(Type) as cnt from  ( 
Select Type from WORK.Statistics_Count
where Type in ('A','B','C')

Union All

Select 'Others' as Type from WORK.Statistics_Count
where Type not in ('A','B','C'))z
group by Type
请尝试以下代码:

Select Type , count(Type) as cnt
from WORK.Statistics_Count
group by Type
根据注释更新代码

    Select Type, count(Type) as cnt from  ( 
Select Type from WORK.Statistics_Count
where Type in ('A','B','C')

Union All

Select 'Others' as Type from WORK.Statistics_Count
where Type not in ('A','B','C'))z
group by Type

您可以通过执行以下操作在
选择中找到计数:

SELECT COUNT(*)
FROM WORK.ListTable
GROUP BY Type

请参阅MySQL(聚合)函数。

您可以通过执行以下操作在
选择中找到计数:

SELECT COUNT(*)
FROM WORK.ListTable
GROUP BY Type
请参阅MySQL(聚合)函数。

尝试以下操作:

select type,count(*) NoofRows from tbl group by type
试试这个:

select type,count(*) NoofRows from tbl group by type

SAS的解决方案是不使用PROC SQL进行此类操作。SQL总是会有点慢或更难/更混乱地编写异常代码(如果没有NotTypeA,这将更容易)。在SAS中,PROC制表和PROC格式将为您提供一个快速转置后轻松。代码多一点,但灵活性更大

data have;
input Id Type  $;
datalines;
1  A
2  B
3  C
4  A
;;;;
run;

proc format lib=work;
value $typeF (multilabel notsorted)
'A'='TypeA'
'B'='TypeB'
'C'='TypeC'
'B','C'='NonTypeA'
;;;;
run;

proc tabulate data=have out=want;
format type $typef.;
class type/mlf preloadfmt order=data;
tables type*n;
run;

proc transpose data=want out=want_t(drop=_NAME_);
var N;
id type;
run;

SAS的解决方案是不使用PROC SQL进行此类操作。SQL总是会有点慢或更难/更混乱地编写异常代码(如果没有NotTypeA,这将更容易)。在SAS中,PROC制表和PROC格式将为您提供一个快速转置后轻松。代码多一点,但灵活性更大

data have;
input Id Type  $;
datalines;
1  A
2  B
3  C
4  A
;;;;
run;

proc format lib=work;
value $typeF (multilabel notsorted)
'A'='TypeA'
'B'='TypeB'
'C'='TypeC'
'B','C'='NonTypeA'
;;;;
run;

proc tabulate data=have out=want;
format type $typef.;
class type/mlf preloadfmt order=data;
tables type*n;
run;

proc transpose data=want out=want_t(drop=_NAME_);
var N;
id type;
run;

如果有比我想计算的类型更多的类型,是否有其他方法将其余的类型分组为“其他”,而不是手动操作?例如,我只需要计算3种类型的A、B、C,但A-z有26种类型,所以C-z会被计算为其他类型?谢谢你的回答。你认为union all会对拥有大约100万条记录的表产生不良影响吗?@Luke Henz对此我不是很确定。如果有比我想计算的类型更多的类型,有没有其他方法将其余的类型分组为“其他”而不是手动操作?例如,我只需要计算3种类型的A、B、C,但A-z有26种类型,所以C-z会被计算为其他类型?谢谢你的回答。你认为union all会对记录约为100万条的表产生不良影响吗?@Luke Henz对此我不是很确定。你为什么建议使用MySQL解决方案?这不是MySql。你为什么建议使用MySql解决方案?这不是MySql。非常感谢,乔。这正是我想要的。工作得很好。我将在sas proc上查找更多信息。非常感谢,乔。这正是我想要的。工作得很好。我将查看更多有关sas proc的信息。