求助:将SQL Server的Unpivot查询迁移至MapR DB(Apache Drill)
把SQL Server的UNPIVOT转换为Apache Drill(MapR DB)兼容的查询
嘿,我来帮你搞定这个转换!Apache Drill(包括MapR DB上的Drill)目前并不支持SQL Server里的UNPIVOT语法,不过咱们可以用两种简单的方式模拟出完全相同的效果——把你的列数据转成行数据。
先回顾下你原来的SQL Server查询逻辑:它会把Tbl1里2005、2006、2007这三列的销售额数据,转换成每行对应一个年份+对应销售额的格式,同时保留原表的其他所有列。
方法1:用UNION ALL模拟(直观易懂)
这是最直接的替代方案,逻辑和UNPIVOT完全对齐:
SELECT *, -- 保留原表所有其他列,不需要的话可以替换成具体列名 '2005' AS Year, 2005 AS Sales FROM Tbl1 WHERE 2005 IS NOT NULL -- 可选:过滤掉空销售额,和UNPIVOT默认行为一致 UNION ALL SELECT *, '2006' AS Year, 2006 AS Sales FROM Tbl1 WHERE 2006 IS NOT NULL UNION ALL SELECT *, '2007' AS Year, 2007 AS Sales FROM Tbl1 WHERE 2007 IS NOT NULL;
方法2:用LATERAL JOIN + VALUES(更简洁,适合多列场景)
如果以后需要转换的年份/列更多,这个方法会更省心,不用重复写多个SELECT:
SELECT t.*, -- 原表的其他列 y.Year, -- 根据年份匹配对应的销售额列 CASE y.Year WHEN '2005' THEN t.2005 WHEN '2006' THEN t.2006 WHEN '2007' THEN t.2007 END AS Sales FROM Tbl1 t -- 生成要转换的年份列表 LATERAL JOIN (VALUES ('2005'), ('2006'), ('2007')) AS y(Year) -- 可选:过滤空销售额 WHERE CASE y.Year WHEN '2005' THEN t.2005 WHEN '2006' THEN t.2006 WHEN '2007' THEN t.2007 END IS NOT NULL;
小提示
如果你的MapR DB是文档型(比如JSON表),列名如果是纯数字或者有特殊字符,记得用反引号包裹,比如t.2005``,避免Drill解析出错。
内容的提问来源于stack exchange,提问作者user1046415
相关产品推荐
相关产品推荐

