我在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
有人可以建议我查询一下吗?
答案 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 |