sql - SQL Server 2016 - 如何做一个简单的数据透视
问题描述
我查看了许多其他示例,但它们总是有某种AVG
或SUM
在他们的数据透视查询中。而且我不知道如何在我的情况下应用它。那里有很多例子,但我无法让它发挥作用。我的查询有什么问题?
我只是想旋转我的表(查询:)SELECT LevelName, ParentNodeName from vOrgStructurePath where orgstructureid = 1545
:
+---+-----------+----------------+
| | LevelName | ParentNodeName |
+---+-----------+----------------+
| 1 | Level1 | Rough |
+---+-----------+----------------+
| 2 | Level2 | Soft |
+---+-----------+----------------+
对此:
+---+--------+--------+
| | Level1 | Level2 |
+---+--------+--------+
| 1 | Rough | Soft |
+---+--------+--------+
这是我的尝试:
SELECT LevelName, ParentNodeName from vOrgStructurePath
PIVOT (LevelName for ParentNodeName IN ([Level1],[Level2])) as level
where orgstructureid = 1545
但它得到了这个错误:
Incorrect syntax near the keyword 'for'.
任何帮助表示赞赏,谢谢!
解决方案
各种枢轴都需要条件聚合。这是 RDBMS 需要将多行合二为一的唯一方法。
一些 RDBMS 提供特定于供应商的函数来实现数据透视逻辑(SQL Server 就是其中之一,就像 Oracle 一样)。但它们基本上只是基本思想之上的语法糖,它总是归结为条件聚合。
我通常反对这些供应商特定的实现,因为查询复杂性几乎没有收益,并且可移植性(和可读性,除非您是该特定语言的专家)损失很大。
这是一个数据透视的标准解决方案,它适用于大多数(如果不是全部)RDBMS:
SELECT
MAX(CASE WHEN LevelName = 'Level1' THEN ParentNodeName END) as [Level1],
MAX(CASE WHEN LevelName = 'Level2' THEN ParentNodeName END) as [Level2]
FROM vOrgStructurePath
WHERE orgstructureid = 1545
orgstructureid
通过如下更改,您可以轻松地一次拥有多个此查询过程:
SELECT
orgstructureid,
MAX(CASE WHEN LevelName = 'Level1' THEN ParentNodeName END) as [Level1],
MAX(CASE WHEN LevelName = 'Level2' THEN ParentNodeName END) as [Level2]
FROM vOrgStructurePath
GROUP BY orgstructureid
这会为每个 生成一条记录orgstructureid
,以及它的Level1
和Level2
值。
推荐阅读
- .htaccess - 更改以查询字符串结尾的 URL
- mysql - Mysql DB的外键约束和构建问题
- python - 为什么每次反向传播函数时,火炬梯度都会线性增加?
- google-cloud-platform - 使用 Google 帐户向 GCP 进行身份验证,无需启动浏览器
- postman - 在邮递员中添加自定义域的问题
- r - 如何在 R 中绘制回归树的预测值与实际值?
- c - 递归二分搜索返回正确的目标,但在数组的中间索引处
- heroku - 如何在 Heroku 上的 Leiningen 应用程序中分离开发和生产密钥?
- linux - 在 Windows 主机和 Linux 来宾之间使用 Hyper-V 套接字
- c# - 如何使用控制器打开 pdf 文件?ASP.NET MVC