Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找计数事件_Sql_Sql Server_Tsql_Pivot - Fatal编程技术网

Sql 查找计数事件

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

我有一个包含两列的表(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 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