感谢您阅读我的博客,如果您现在工作、学习累了或者疲惫了,不妨聆听一下音乐,它能够减轻你的疲劳,还能够带给您一种舒适愉悦的心情。如果您认为这篇文章还不错或者有所收获,您可以在页面 右侧和底部 扫描二维码 打赏我,您的鼓励是我继续写作、分享的最大动力!

SQL面试题-SQL行转列

需求截图
教师号 星期号 是否有课
1 2
1 3
2 1
2 2
3 2
1 2

 

教师号 星期一 星期二 星期三
1 0 2 1
2 1 1 0
3 0 1 0
/*
    SQL面试题-SQL行转列
    LDH @ 2021-10-14
    https://www.cnblogs.com/LifeDecidesHappiness/p/9020685.html
*/

USE TestDB;
GO
-- 删除临时表
IF OBJECT_ID('tempdb..#Table') IS NOT NULL
BEGIN
    DROP TABLE #Table;
END;

IF OBJECT_ID('tempdb..#Table2') IS NOT NULL
BEGIN
    DROP TABLE #Table2;
END;


CREATE TABLE #Table
(
    TeacherNo INT NOT NULL,
    WeekNo NVARCHAR(10) NOT NULL,
    ClassNum INT NOT NULL
);

CREATE TABLE #Table2
(
    TeacherNo INT NOT NULL,
    WeekNo INT NOT NULL,
    HasClass NVARCHAR(2)
);

INSERT INTO #Table2
(
    TeacherNo,
    WeekNo,
    HasClass
)
VALUES
(1, 2, N''),
(1, 3, N''),
(2, 1, N''),
(2, 2, N''),
(3, 2, N''),
(1, 2, N'');

SELECT TeacherNo,
       WeekNo,
       HasClass
FROM #Table2;

/*
   WITH it (TeacherNo, WeekNo, HasClass)
AS (SELECT TeacherNo,
           WeekNo = (CASE WeekNo
                         WHEN 1 THEN
                             N'星期一'
                         WHEN 2 THEN
                             N'星期二'
                         WHEN 3 THEN
                             N'星期三'
                     END
                    ),
           HasClass = (CASE HasClass
                           WHEN '有' THEN
                               1
                           ELSE
                               0
                       END
                      )
    FROM #Table2)

SELECT it.TeacherNo,
       it.WeekNo,
       ClassNum = COUNT(it.HasClass)
FROM it
GROUP BY it.TeacherNo,
         it.WeekNo
ORDER BY it.TeacherNo ASC;
*/

WITH it (TeacherNo, WeekNo, HasClass)
AS (SELECT TeacherNo,
           WeekNo = (CASE WeekNo
                         WHEN 1 THEN
                             N'星期一'
                         WHEN 2 THEN
                             N'星期二'
                         WHEN 3 THEN
                             N'星期三'
                     END
                    ),
           HasClass = (CASE HasClass
                           WHEN '' THEN
                               1
                           ELSE
                               0
                       END
                      )
    FROM #Table2)
INSERT INTO #Table
(
    TeacherNo,
    WeekNo,
    ClassNum
)
SELECT it.TeacherNo,
       it.WeekNo,
       ClassNum = COUNT(it.HasClass)
FROM it
GROUP BY it.TeacherNo,
         it.WeekNo
ORDER BY it.TeacherNo ASC;

--    行转列
SELECT '教师号' = X.TeacherNo,
       '星期一' = ISNULL(X.星期一, ''),
       '星期二' = ISNULL(X.星期二, ''),
       '星期三' = ISNULL(X.星期三, '')
FROM #Table AS Temp
    PIVOT
    (
        SUM(ClassNum)
        FOR Temp.WeekNo IN (星期一, 星期二, 星期三)
    ) AS X;

 

 

 

posted @ 2018-05-10 17:20  Love In Winter  阅读(49)  评论(0编辑  收藏  举报
作者: LifeDecidesHappiness
出处: http://www.cnblogs.com/LifeDecidesHappiness/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,否则保留追究法律责任的权利,且在文章页面明显位置给出原文连接,如有问题,可以通过以下邮箱地址 2468881301@qq.com  联系我,非常感谢。
踏实做一个为人民服务的搬运工!
如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能,您的支持和鼓励是我继续写作、分享的最大动力!

点击关注不迷路,让我带你上高速!