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 表的主要内容,如果未能解决你的问题,请参考以下文章