mat*_*360 5 sql t-sql sql-server pivot sql-server-2005
我有3个表看起来像这样:
tblVideo:
VideoID | Video Name
1 video 1
2 video 2
3 video 3
4 video 4
tblCategory:
CategoryID | CategoryName
1 category1
2 category2
3 category3
tblVideoCategory:
VideoID | CategoryID
1 3
2 1
2 2
3 1
3 2
3 3
4 1
Run Code Online (Sandbox Code Playgroud)
我想编写一个返回一个如下所示的表的查询:
vVideoCategory:
VideoID | VideoName | category1 | category2 | category3
1 video 1 false false true
2 video 2 true true false
3 video 3 true true true
4 video 4 true false false
Run Code Online (Sandbox Code Playgroud)
我试过四处寻找例子,但还没有找到任何看似相同的东西.任何帮助将不胜感激,谢谢.
绝对寻找允许更改和添加/删除类别的内容.
使用:
SELECT v.videoid,
v.video_name,
COALESCE(MAX(CASE WHEN vc.categoryid = 1 THEN 'true' END), 'false') AS category1,
COALESCE(MAX(CASE WHEN vc.categoryid = 2 THEN 'true' END), 'false') AS category2,
COALESCE(MAX(CASE WHEN vc.categoryid = 3 THEN 'true' END), 'false') AS category3
FROM tblvideo v
JOIN tblvideocategory vc ON vc.videoid = v.videoid
GROUP BY v.videoid, v.video_name
Run Code Online (Sandbox Code Playgroud)
SQL Server 2005+:
DECLARE @SQL AS NVARCHAR(4000)
DECLARE @categoryid AS INT
DECLARE CUR CURSOR FAST_FORWARD FOR
SELECT c.categoryid
FROM tblcategory c
ORDER BY c.categoryid
SET @SQL = N'SELECT v.videoid,
v.video_name, '
OPEN CUR
FETCH NEXT FROM CUR INTO @categoryid
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = @SQL + ' COALESCE(MAX(CASE WHEN vc.categoryid = '+ @categoryid +' THEN 'true' END), 'false') AS category'+ @categoryid +' ,'
FETCH NEXT FROM CUR INTO @categoryid
END
CLOSE CUR;
DEALLOCATE CUR;
--Get rid of trailing comma at the end
SELECT @SQL = SUBSTRING(@SQL, 1, LEN(@SQL) -1)
SET @SQL = @SQL + ' FROM tblvideo v
JOIN tblvideocategory vc ON vc.videoid = v.videoid
GROUP BY v.videoid, v.video_name
ORDER BY v.videoid, v.video_name '
BEGIN
EXEC sp_executesql @SQL
END
Run Code Online (Sandbox Code Playgroud)