PIVOT 没有聚合转换 2X2 表

Posted

技术标签:

【中文标题】PIVOT 没有聚合转换 2X2 表【英文标题】:PIVOT without aggregate converting 2X2 Table 【发布时间】:2020-08-19 08:08:30 【问题描述】:

我将下表命名为 客户

我想把它转换成这个:

如何在 SQL 上使用数据透视?

我尝试了以下方法,但没有成功:

SELECT name, Andy
FROM
(
  SELECT number, name
  FROM Customer
)
t
pivot
(number(123)
FOR name IN (Andy))
AS pivot_table;

谁能告诉我这里做错了什么? 谢谢。

【问题讨论】:

Why should I tag my DBMS 【参考方案1】:

什么样的数据库?

对于 SQL Server,我会这样做:

SELECT IIF(n = 1, 'Name', 'Number') [ColumnName]
     , IIF(n = 1, [Name], CAST([number] AS VARCHAR(100))) [Value]
FROM Customer  a
    CROSS JOIN (VALUES (1), (2)) b (n)

【讨论】:

这是一个包含所有客户及其客户 ID 的数据库。我在这里不明白:CAST([number] AS VARCHAR(100))) [Value] 还有 (VALUES (1), (2)) b (n)。你说这些是什么意思?我应该在公式中输入什么? 我希望 Customer 表的格式为“[Name] varchar(100), Number int”。如果是这种情况并且您使用的是 SQL Server,那么上面的语句会返回一个包含两列的数据集,一列包含列名称(名称或编号),另一列包含值。我没有使用 pivot 命令来旋转表格,而是使用具有两个值 (1,2) 的表格来构造数据透视表。 如果您使用 SQL Server 以外的其他数据库系统,则查询看起来会有所不同,因为 DBMS 之间的语法不同。 所以对于上面的表格,我尝试执行以下语法: SELECT IIF(n = 1, 'Name', 'Number') [Name] , IIF(n = 1, [Name] , CAST([number] AS VARCHAR(100))) [123] FROM Customer a CROSS JOIN (VALUES (1), (2)) b (n) 仍然没有工作.. 我一开始就这样做了:SELECT number, name FROM Customer where number = 123 因为我只需要这个特定的客户来更改列。然后我得到了结果:i.stack.imgur.com/egARN.png 我想将其更改为:i.stack.imgur.com/H1d2s.png 希望它能澄清我的问题。【参考方案2】:

你想要做的是unpivot数据。在 SQL Server 中,我推荐CROSS APPLY——横向连接的语法:

SELECT v.*
FROM Customer c CROSS APPLY
     (VALUES ('Name', Name),
             ('Number', CAST(number as VARCHAR(255)))
     ) v(col, value);

【讨论】:

我对这部分感到困惑: (VALUES ('Name', Name), ('Number', CAST(number as VARCHAR(255))) ) v(col, value);我应该放哪一个“名字”,哪一个是“安迪”?还有值,我在哪里放 123,在哪里写“数字”? @ellawidya。 . .我对你的困惑感到困惑。 'Andy' 是列中的一个值,所以它是Name'Name' 是列的名称,这就是为什么它是一个常量。

以上是关于PIVOT 没有聚合转换 2X2 表的主要内容,如果未能解决你的问题,请参考以下文章

SQL中PIVOT 行列转换

SQL Server中行列转换 Pivot UnPivot

SQL Server中行列转换 Pivot UnPivot

在没有任何聚合函数的情况下将列数据转换为行

SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例

如何用Pivot实现行列转换