枢转一张表,其中有一个标题行和一个数据行

时间:2019-04-03 22:54:17

标签: sql pivot

随附的代码生成一个包含一行和十二列的简单表。我的目标是将最终结果设置为显示12行和两列,每列标题分别为MXDate。我是SQL的新手,今天下午无法实现它。请帮忙。

我尝试查看多个枢轴示例,但它们似乎都展示了相反的内容,即将行转换为列。也许我对此并不陌生,但是我无法想象如果相反的话代码会是什么样子。我相信这很容易。我只需要看它即可学习。

DECLARE @queryDate1 datetime SET @queryDate1 = '04/30/2017';
DECLARE @queryDate2 datetime set @queryDate2 = '03/31/2017';
DECLARE @queryDate3 datetime SET @queryDate3 = '04/30/2017';
DECLARE @queryDate4 datetime set @queryDate4 = '03/31/2017';
DECLARE @queryDate5 datetime SET @queryDate5 = '04/30/2017';
DECLARE @queryDate6 datetime set @queryDate6 = '03/31/2017';
DECLARE @queryDate7 datetime SET @queryDate7 = '04/30/2017';
DECLARE @queryDate8 datetime set @queryDate8 = '03/31/2017';
DECLARE @queryDate9 datetime SET @queryDate9 = '04/30/2017';
DECLARE @queryDate10 datetime set @queryDate10 = '03/31/2017';
DECLARE @queryDate11 datetime SET @queryDate11 = '04/30/2017';
DECLARE @queryDate12 datetime set @queryDate12 = '03/31/2017';


SELECT
     convert(varchar(10),@queryDate1,101) as [M1]
    ,convert(varchar(10),@queryDate2,101) as [M2]
    ,convert(varchar(10),@queryDate3,101) as [M3]
    ,convert(varchar(10),@queryDate4,101) as [M4]
    ,convert(varchar(10),@queryDate5,101) as [M5]
    ,convert(varchar(10),@queryDate6,101) as [M6]
    ,convert(varchar(10),@queryDate7,101) as [M7]
    ,convert(varchar(10),@queryDate8,101) as [M8]
    ,convert(varchar(10),@queryDate9,101) as [M9]
    ,convert(varchar(10),@queryDate10,101) as [M10]
    ,convert(varchar(10),@queryDate11,101) as [M11]
    ,convert(varchar(10),@queryDate12,101) as [M12]`

实际结果将是具有两列的表。第一列的标题为MX,第一条记录为M1,第二行为M2,依此类推,直到M12

第二列将被标记为Date,第一记录将是04/30/2017,第二记录将是03/31/2017,依此类推。

总而言之,该表从12列和1行变为12行和2列(不包括标题)。

2 个答案:

答案 0 :(得分:0)

您可以使用UNION ALL

SELECT 'M1' AS [MX], M1 AS [Date] FROM mytable
UNION ALL SELECT 'M2', M2 AS [Date] FROM mytable
UNION ALL SELECT 'M3', M3 AS [Date] FROM mytable
UNION ALL SELECT 'M4', M4 AS [Date] FROM mytable
--- and so on until M12

Demo on DB Fiddle

MX | Date      
:- | :---------
M1 | 04/30/2017
M2 | 03/31/2017
M3 | 04/30/2017
M4 | 03/31/2017

答案 1 :(得分:0)

只需生成您想要的表即可

select v.header,
       convert(varchar(10), v.dte, 101)
from (values (@queryDate1, 'M1'),
             (@queryDate2, 'M2'),
             (@queryDate3, 'M3'),
             . . .
     ) v(dte, header);