2012-10-09 28 views
6

Tôi có một bảng với 2 cột (db: SQL Server 2008):Tìm COUNT lần

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

Tôi muốn để có được một số tên bắt đầu bằng B và bắt đầu với M (trong một hàng)?

Giống như:

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

Điều duy nhất mà đi lên đối với tôi là một công đoàn. Bất kỳ ý tưởng để làm nó sạch hơn trong một truy vấn duy nhất (không có công đoàn)?

+0

Tôi không biết làm thế nào một liên minh sẽ giúp bạn có hai cột – Paparazzi

Trả lời

4

Hãy thử nó bằng cách sử dụng 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

có lẽ thêm một nơi SUBSTRING (tên, 1 , 1) in ('B', 'M') – Paparazzi

+1

Cảm ơn bạn, hoạt động tuyệt vời! –

4

Bạn có thể sử dụng PIVOT cho việc này. Nếu bạn có một số tiếng của cột, sau đó bạn có thể mã hóa cứng các giá trị với một PIVOT TĨNH:

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 

Xem SQL Fiddle With Demo

Nếu bạn có một số không rõ các cột để chuyển đổi, sau đó bạn có thể sử dụng sql năng động và tạo ra một PIVOT động:

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) 

Xem SQL Fiddle with Demo

Nếu sau đó bạn muốn lọc dữ liệu thiết lập xuống o nly những người bắt đầu với B or M thì bạn có thể sử dụng mệnh đề WHERE để lọc.

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

Đánh tôi vào trục – RThomas

1

Dưới đây là một cách khác

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

quả

Count of B Count of M 
4    3