2012-10-09 19 views
6

Ho una tabella con 2 colonne (db: SQL Server 2008):conteggio Trova le occorrenze

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

voglio ottenere un conteggio di nomi che iniziano con B e iniziano con M (in una riga)?

come:

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

L'unica cosa che viene in su per me è un sindacato. Qualche idea per farlo più pulito in una singola query (nessun sindacato)?

+0

Non so come un sindacato otterrà voi due colonne – Paparazzi

risposta

4

provare da utilizzando 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

forse aggiungere un dove SUBSTRING (nome, 1 , 1) in ('B', 'M') – Paparazzi

+1

Grazie, funziona benissimo! –

4

È possibile utilizzare PIVOT per questo. Se si dispone di un numero limitato di colonne, allora si può codificare i valori con un perno STATICA:

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 

Vedi SQL Fiddle With Demo

Se si dispone di un numero imprecisato di colonne per trasformare, quindi è possibile utilizzare SQL dinamico e creare un perno dinamico:

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) 

Vedi SQL Fiddle with Demo

Se poi si desidera filtrare i dati stabiliti a O solo quelli che iniziano con B or M allora puoi usare una clausola WHERE per filtrare.

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

Beat me to the pivot – RThomas

1

Ecco un altro modo

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

Risultato

Count of B Count of M 
4    3 
Problemi correlati