SQL计数报告查询

时间:2017-10-30 07:46:40

标签: sql sql-server

我在SQL Server中有以下表。

测试。

id  | Author| Ext
----+-------+--------
01  | Bill  | txt
02  | Tom   | pdf
03  | Bill  | doc
04  | Alex  | txt
05  | Alex  | pdf
06  | Tom   | pdf

我想要根据id输出以下内容。

  | Author| txt | pdf | doc
  --------+-----+-----+-----
  | Bill  |  1  |  0  |  1
  | Tom   |  0  |  2  |  0
  | Alex  |  1  |  1  |  0

有人可以建议我查询一下吗?

6 个答案:

答案 0 :(得分:2)

使用CASE表达式。

<强>查询

select [Author],
sum(case [Ext] when 'txt' then 1 else 0 end) as [txt],
sum(case [Ext] when 'pdf' then 1 else 0 end) as [pdf],
sum(case [Ext] when 'doc' then 1 else 0 end) as [doc]
from [your_table_name]
group by [Author];

答案 1 :(得分:0)

CASE表达式应如下使用:

SELECT
    author,
    COUNT(CASE WHEN ext = 'txt' THEN 1 END) as txt,
    COUNT(CASE WHEN ext = 'pdf' THEN 1 END) as pdf,
    COUNT(CASE WHEN ext = 'doc' THEN 1 END) as doc
FROM myTable
GROUP BY author

答案 2 :(得分:0)

使用下面的pivot方法:

 CREATE TABLE #Temp ( id VARCHAR(10) , Author VARCHAR(10), Ext VARCHAR(10) )

 INSERT INTO  #Temp ( id , Author , Ext ) 
 SELECT 01,'Bill','txt' UNION ALL
 SELECT 02,'Tom','pdf' UNION ALL
 SELECT 03,'Bill','doc' UNION ALL
 SELECT 04,'Alex','txt' UNION ALL
 SELECT 05,'Alex','pdf' UNION ALL
 SELECT 06,'Tom','pdf' 

 SELECT *
 FROM 
  (
    SELECT Author , Ext 
    FROM #Temp
  ) A
 PIVOT 
 ( 
     COUNT(Ext) FOR Ext IN ([txt],[pdf],[doc])
 )   A 

答案 3 :(得分:0)

使用PIVOT

with a as
(select 1 as a_id,'abc' as author,'txt' as ext from dual
union
select 2 ,'pqr' as author,'pdf' as ext from dual
union
select 3,'abc' as author,'doc' as ext from dual
union
select 4,'lmn' as author,'txt' as ext from dual
union
select 5,'pqr' as author,'pdf' as ext from dual
)
select * 
from 
  ( select *
    from a
  ) pivot 
  ( count(ext) 
    for ext in 
    ('txt' as txt_ext,'pdf' as pdf_ext,'doc' as doc_ext)
  );

答案 4 :(得分:0)

对于这个选项,我认为使用pivot是最好的方法;

reference.txt

答案 5 :(得分:0)

如果您希望Ext列值是动态的,则可以使用动态查询字符串。

示例:

CREATE TABLE Table1
    (id int, author varchar(100), ext varchar(3));



INSERT INTO Table1
    (id, author, ext)
VALUES
    (1, 'Bill', 'txt'),
    (2, 'Tom', 'pdf'),
    (3, 'Bill', 'doc'),
    (4, 'Alex', 'txt'),
    (5, 'Alex', 'pdf'),
    (6, 'Tom', 'pdf')

查询1

DECLARE @MyCursor CURSOR
DECLARE @SQLString NVARCHAR(MAX)
DECLARE @MyField VARCHAR(30)

SET @SQLString = 'SELECT author ' 

 SET @MyCursor = CURSOR FOR
 SELECT ext FROM Table1 group by ext

OPEN @MyCursor 

FETCH NEXT FROM @MyCursor 
    INTO @MyField

WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @SQLString = @SQLString + ',sum(case [ext] when ''' + @MyField  + ''' then 1 else 0 end) as ' + @MyField 
    FETCH NEXT FROM @MyCursor 
      INTO @MyField 
    END


CLOSE @MyCursor 
DEALLOCATE @MyCursor 

SET @SQLString = @SQLString + ' FROM Table1 group by author'

 EXECUTE sp_executesql  @SQLString

<强> Results

| author | doc | pdf | txt |
|--------|-----|-----|-----|
|   Alex |   0 |   1 |   1 |
|   Bill |   1 |   0 |   1 |
|    Tom |   0 |   2 |   0 |