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的信息。