透视具有一个标题行和一个数据行的表

Posted

技术标签:

【中文标题】透视具有一个标题行和一个数据行的表【英文标题】:Pivot a table with one header row and one data row 【发布时间】:2019-04-03 22:54:16 【问题描述】:

附加的代码会生成一个包含一行十二列的简单表格。我的目标是将最终结果转为显示 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 列(不包括标题)。

【问题讨论】:

这可以通过UNPIVOT 完成。但是,如果您正在构建这样的查询,则可能没有必要。你可以做类似SELECT [MX] = 'M1', [Date] = convert(varchar(10),@queryDate1,101) UNION ALL... 【参考方案1】:

你可以使用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 |日期 :- | :--------- M1 | 2017 年 4 月 30 日 M2 | 2017 年 3 月 31 日 M3 | 2017 年 4 月 30 日 M4 | 2017 年 3 月 31 日

【讨论】:

有效。非常感谢。 @BillSingh:欢迎!如果我的回答正确回答了您的问题,请点击绿色复选标志接受...谢谢!【参考方案2】:

只需预先生成您想要的表格:

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

【讨论】:

以上是关于透视具有一个标题行和一个数据行的表的主要内容,如果未能解决你的问题,请参考以下文章

您可以对数据透视表中的行和/或列进行小计吗?

透视具有多个值的表

透视数据并将单列放入具有关联行的多列中

在数据透视表 laravel 中删除行和插入行

具有两行到列的数据透视表

具有非基值的数据透视表