sql - MS-Access SQL Pivot 多列
问题描述
我有一个如下所示的数据表:
流ID | 期间ID | 最小 | 最大限度 |
---|---|---|---|
STR_01 | 1 | 0 | 9 |
STR_01 | 2 | 0 | 7 |
STR_01 | 3 | 4 | 9 |
STR_02 | 1 | 2 | 5 |
STR_02 | 2 | 1 | 8 |
STR_02 | 3 | 0 | 6 |
我想构建一个如下所示的数据透视表:
流ID | MIN1 | MIN2 | MIN3 | MAX1 | MAX2 | MAX3 |
---|---|---|---|---|---|---|
STR_01 | 0 | 0 | 4 | 9 | 7 | 9 |
STR_02 | 2 | 1 | 0 | 5 | 8 | 6 |
如何使用 SQL 语言做到这一点?是否可以直接使用多个字段值进行数据透视,或者我是否需要取消透视原始表并与数据透视表创建连接?是否可以加入数据透视表?我试图像这样取消透视数据:
流ID | 期间ID | 范围 | 价值 |
---|---|---|---|
STR_01 | 1 | 最小 | 0 |
STR_01 | 1 | 最大限度 | 9 |
STR_01 | 2 | 最小 | 0 |
STR_01 | 2 | 最大限度 | 7 |
STR_01 | 3 | 最小 | 4 |
STR_01 | 3 | 最大限度 | 9 |
解决方案
如果类是固定的,并且周期数也是固定的,则以下查询会产生您想要的结果:
TRANSFORM First(MinMax)
SELECT StreamID
FROM
( SELECT StreamID, "MIN" & PeriodID AS Piv, MIN AS MinMax
FROM Tabla1
UNION ALL
SELECT StreamID, "MAX" & PeriodID AS Piv, MAX AS MinMax
FROM Tabla1
)
GROUP BY StreamID
PIVOT Piv
IN ("MIN1", "MIN2", "MIN3", "MAX1", "MAX2", "MAX3") ;
如果句点数是动态的而不是固定的,您只需要删除“IN”子句,它仍然可以工作,尽管列的顺序将由列名的字母数字顺序决定。在这种特定情况下,“MAX”列将出现在“MIN”列之前。
您可能还想查看可从LightningGuide.net下载的数据库中的五个示例查询“F_Transform_...” 。
我上面提供的查询代码可以推广到具有更多类(MIN,MAX,MID,...)的情况,只要提前知道类,只需增加 UNION 和 SELECT 子句的数量即可。
推荐阅读
- java - 谁关闭了从 try with resources 块中返回的“InputStream”?
- android - 白色 MaterialShapeDrawable 在海拔高度上为灰色
- azure-devops - Azure Devops:仅在前一阶段超时时运行任务的自定义条件
- node.js - 用安装了 chart.js 的 date-fns 替换 moment.js
- c# - 如何序列化字典
- node.js - 在 Heroku 上部署时我无法理解的一大堆错误
- javascript - chrome 扩展 content.js 使动态网站崩溃
- python - 如何使用多个条件搜索列表并获得最佳匹配?
- node.js - 为 Electron React JS 应用程序创建安装程序 - reactJS 组件在安装后运行时不加载
- outlook - 如何设置通过java代码发送电子邮件的azure信息保护标签?