You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:51:27