2012-10-09 51 views
6

Tengo una tabla con 2 columnas (db: servidor SQL 2008):Búsqueda contar los casos

id   name 
-----  ------ 
1   Bob 
2   Mike 
3   Mary 
4   Mike 
5   Barry 
6   Benson 
7   Burrows 

Quiero conseguir un recuento de los nombres que empiezan con B y comienzan con M (en una fila)?

igual:

Count of B  Count of M 
-----------  ------------ 
4     3 

La única cosa que viene para mí es un sindicato. ¿Alguna idea de hacerlo más limpio en una sola consulta (sin unión)?

+0

No sé cómo una unión le conseguirá dos columnas – Paparazzi

Respuesta

4

probar por su uso de 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 

SQLFiddle Demo

+0

tal vez añadir un SUBSECUENCIA donde (nombre, 1 , 1) en ('B', 'M') – Paparazzi

+1

¡Gracias, funciona genial! –

4

Usted puede utilizar PIVOT para esto. Si usted tiene un número conocido de columnas, entonces usted puede codificar los valores de un pivote ESTÁTICO:

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 

Ver SQL Fiddle With Demo

Si usted tiene un número desconocido de columnas para transformar, a continuación, puede utilizar SQL dinámico y crear un pivote dinámico:

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) 

Ver SQL Fiddle with Demo

Si a continuación desea filtrar los datos establecidos a O nly aquellos que comienzan con B or M, entonces puede usar una cláusula WHERE para filtrar.

where substring(name, 1, 1) in ('B', 'M') 
+0

Pégame al pivote – RThomas

1

Aquí es otra forma

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') 

Resultado

Count of B Count of M 
4    3 
Cuestiones relacionadas