2012-10-06 31 views
1

我有如下表:T-SQL:计数和集团通过在多个列

 
Name | Col1 | Col2 | Col3 
John A  B  C 
John A  D  A 
Bill A  A  D 
Bill F  A  A 
Steve F  A  B 
Steve C  C  A 

我想知道一共有多少正如约翰,比尔和史蒂夫有...

例如约翰:3,比尔:4,史蒂夫:2

我怎么能使用T-SQL做到这一点?谢谢。

+0

您的意思是max A或max any? – Paparazzi

回答

1

试试这个SQL Fiddle For below

declare @table table (name varchar(10), c1 char(1), c2 char(1), c3 char(1)) 
insert into @table 
SELECT 'John','A','B','C' UNION 
SELECT 'John','A','D','A' UNION 
SELECT 'Bill','A','A','D' UNION 
SELECT 'Bill','F','A','A' UNION 
SELECT 'Steve','F','A','B' UNION 
SELECT 'Steve','C','C','A' 

; WITH CTE AS 
(
    SELECT name, 
     (SELECT Count(CASE WHEN val = 'A' Then 1 ELse Null end) 
     FROM (VALUES (c1),(c2),(c3)) AS value(val)) As ACOL 
    from @table 
) 

SELECT Name, SUM(ACOL) ACount FROM CTE GROUP BY NAME 
5

可以使用UNPIVOT功能:

select name, count(val) TotalAs 
from yourtable 
unpivot 
(
    val 
    for col in (col1, col2, col3) 
) u 
where val = 'A' 
group by name 

SQL Fiddle with Demo

+0

+1非常优雅。如果我发布的答案,我仍然会这样做的老式的方式。 –

+0

仍抵制回答问题? – Taryn

+1

是的,加重不再值得。 –

0

这样如何为SQL Server 2012?它可能会更快。

select name,sum(datalength(concat(col1,col2,col3))- 
       datalength(replace(concat(col1,col2,col3),'A',''))) 
from yourtable 
group by name;