2012-10-09 13 views
6

Mam tabeli z 2 kolumny (DB: serwera SQL 2008):Ilość Wyszukiwanie zdarzeń

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

Chcę uzyskać liczbę nazw, które zaczynają się na literę B i zaczynają się na literę M (w jednym rzędzie)?

odczuwalna:

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

Jedyną rzeczą, która przychodzi do mnie to zjednoczenie. Wszelkie pomysły, aby zrobić to czystsze w jednym zapytaniu (bez związku)?

+0

Nie wiem, w jaki sposób Unia będzie Ci dwie kolumny – Paparazzi

Odpowiedz

4

Spróbuj za pomocą 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

może dodać gdzie podciąg (nazwa, 1 , 1) w ("B", "M") – Paparazzi

+1

Dziękuję, działa świetnie! –

4

Można użyć PIVOT do tego. Jeśli masz znaną liczbę kolumn, a następnie można twardego kod wartości ze statycznym 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 

Zobacz SQL Fiddle With Demo

Jeśli masz nieznaną liczbę kolumn do transformacji, a następnie można użyć dynamiczny SQL i stworzyć dynamiczny PIVOT:

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) 

Zobacz SQL Fiddle with Demo

Jeśli następnie chcesz filtrować dane określone w dół do o Na przykład te, które zaczynają się od B or M, można użyć klauzuli WHERE do filtrowania.

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

Uderz mnie w czop – RThomas

1

Oto kolejny sposób

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

Wynik

Count of B Count of M 
4    3