行转列的三种实现方式
题目背景:数据库中有一张这样的表p_room(RoomGUID(PK),HUXING,RoomStru,OtherAttri),其中主键RoomGUID表示房间标识,HUXING表示户型,如“CW”、“H3”、“T1”等;RoomStru表示房间结构,如“车位”、“两房两厅一卫”、“一房一厅一卫”;OtherAttri表示其他冗余字段。
题目要求:请按户型统计每种房间结构下的房间数目,显示格式如下表所示,写出查询语句。

HUXING
车位
两房两厅一卫
一房一厅一卫
CW
 
 
 
H3
 
 
 
H1
 
 
 

 
--solution1,利用case-when语句
SELECT HUXING,
       SUM(CASE RoomStru
           WHEN '车位' THEN 1
           ELSE 0 end) AS 车位,
       SUM(CASE RoomStru
           WHEN '两房两厅一卫' THEN 1
           ELSE 0 end) AS 两房两厅一卫,
       SUM(CASE RoomStru
           WHEN '一房一厅一卫' THEN 1
           ELSE 0 end) AS 一房一厅一卫
FROM dbo.p_Room
GROUP BY HUXING
 
--solution2,用标量子查询实现
Select     a.HUXING,
           (Select Count(*)
           From p_room
           Where Roomstru='车位' And
                 HUXING=a.HUXING) As 车位,
           (Select Count(*)
           From p_room
           Where Roomstru='两房两厅一卫' And
                 HUXING=a.HUXING) As 两房两厅一卫,
           (Select Count(*)
           From p_room
           Where Roomstru='一房一厅一卫' And
                 HUXING=a.HUXING) As 一房一厅一卫
From p_room a
GROUP BY a.HUXING
 
--solution3,用连接查询和多值子查询的结合实现,其中的Null值替换为值的操作由case-when实现
Select a.HUXING,
       (Case When 车位Is Null Then 0 Else 车位End) As 车位,
       (Case When 两房两厅一卫Is Null Then 0 Else 两房两厅一卫End) As 两房两厅一卫,
       (Case When 一房一厅一卫Is Null Then 0 Else 一房一厅一卫End) As 一房一厅一卫
From
(Select Distinct HUXING
 From p_room) a
Left Join
(Select HUXING,Count(*) As 车位
 From p_room
 Where RoomStru='车位'
 GROUP BY HUXING
) b
    On a.HUXING=b.HUXING
Left Join
(Select HUXING,Count(*) As 两房两厅一卫
 From p_room
 Where RoomStru='两房两厅一卫'
 GROUP BY HUXING
) c
    On a.HUXING=c.HUXING
Left Join
(Select HUXING,Count(*) As 一房一厅一卫
 From p_room
 Where RoomStru='一房一厅一卫'
 GROUP BY HUXING
) d
    On a.HUXING=d.HUXING
以上三种思路,仅供参考,欢迎提出建议。