Sql 查找计数事件
我有一个包含两列的表(db:sql server 2008): 我想得到以B和M开头的名称的计数(在一行中) 比如:Sql 查找计数事件,sql,sql-server,tsql,pivot,Sql,Sql Server,Tsql,Pivot,我有一个包含两列的表(db:sql server 2008): 我想得到以B和M开头的名称的计数(在一行中) 比如: 我唯一想到的是一个联盟。有什么办法可以在一个查询(无联合)中更简洁地完成它吗?使用CASE试试看 SELECT SUM(CASE WHEN SUBSTRING(name,1,1) = 'B' Then 1 ELSE 0 END), SUM(CASE WHEN SUBSTRING(name,1,1) = 'M' Then 1 ELSE 0 END) FROM TA
我唯一想到的是一个联盟。有什么办法可以在一个查询(无联合)中更简洁地完成它吗?使用
CASE
试试看
SELECT SUM(CASE WHEN SUBSTRING(name,1,1) = 'B' Then 1 ELSE 0 END),
SUM(CASE WHEN SUBSTRING(name,1,1) = 'M' Then 1 ELSE 0 END)
FROM TAbleName
您可以为此使用
PIVOT
。如果列数已知,则可以使用静态轴硬编码值:
select *
from
(
select substring(name, 1, 1) name, -- use the same field twice,
substring(name, 1, 1) initial -- once will be for the count the other for columns
from yourtable
) x
pivot
(
count(name)
for initial in ([B], [M])
) p
看
如果要转换的列数未知,则可以使用动态sql并创建动态透视:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ','
+ QUOTENAME(substring(name, 1, 1))
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + ' from
(
select substring(name, 1, 1) name,
substring(name, 1, 1) initial
from yourtable
) x
pivot
(
count(name)
for initial in (' + @cols + ')
) p '
execute(@query)
看
然后,如果要将数据集筛选为仅以B或M开头的数据集,则可以使用WHERE
子句进行筛选
where substring(name, 1, 1) in ('B', 'M')
这是另一种方法
Declare @T Table ([id] varchar(5), [name] varchar(7));
INSERT INTO @T([id], [name])
VALUES
('1', 'Bob'),
('2', 'Mike'),
('3', 'Mary'),
('4', 'Mike'),
('5', 'Barry'),
('6', 'Benson'),
('7', 'Burrows')
;WITH CTE AS
(SELECT
Initials = SUBSTRING(name,1,1)
,Cnt = COUNT([name])
FROM @t
GROUP BY SUBSTRING(name,1,1))
SELECT
[Count of B] = (SELECT Cnt FROM CTE WHERE Initials = 'B')
,[Count of M] = (SELECT Cnt FROM CTE WHERE Initials = 'M')
结果
Count of B Count of M
4 3
我不知道一个并集如何得到两列可以在('B','M'中添加一个where子字符串(名称,1,1)
Declare @T Table ([id] varchar(5), [name] varchar(7));
INSERT INTO @T([id], [name])
VALUES
('1', 'Bob'),
('2', 'Mike'),
('3', 'Mary'),
('4', 'Mike'),
('5', 'Barry'),
('6', 'Benson'),
('7', 'Burrows')
;WITH CTE AS
(SELECT
Initials = SUBSTRING(name,1,1)
,Cnt = COUNT([name])
FROM @t
GROUP BY SUBSTRING(name,1,1))
SELECT
[Count of B] = (SELECT Cnt FROM CTE WHERE Initials = 'B')
,[Count of M] = (SELECT Cnt FROM CTE WHERE Initials = 'M')
Count of B Count of M
4 3