我有一个包含 4 列的表格:状态、笔、铅笔、纸,最后 3 列显示二进制值(1 或 0)。
State Pens Pencils Papers
NY 1 0 1
CA 1 1 1
TX 0 0 1
下面的代码可以在 T-SQL 中运行,但我在将其转换为 Snow SQL 时遇到问题。
SELECT X.State, Result.Combination
FROM Dataset X
CROSS APPLY (SELECT 'Pens' AS Val WHERE X.Pens = 1 UNION ALL SELECT NULL) Pens
CROSS APPLY (SELECT 'Pencils' AS Val WHERE X.Pencils = 1 UNION ALL SELECT NULL) Pencils
CROSS APPLY (SELECT 'Papers' AS Val WHERE X.Papers = 1 UNION ALL SELECT NULL) Papers
CROSS APPLY (SELECT CONCAT_WS(',', Pens.Val, Pencils.Val, Papers.Val) AS Combination) Result
WHERE Result.Combination > ''
ORDER BY X.State, LEN(Result.Combination), Result.Combination
当每个列名称的输出等于 1 (TRUE) 时,我尝试返回 Snow SQL 中所有列名称组合的列表。
例如,结果表应显示纽约州的以下 3 行:
State Combination
NY Pens
NY Papers
NY Pens, Papers
我尝试了 CROSS JOIN LATERAL,但它抛出错误“无法评估不支持的子查询类型”,而其他方法(例如将其分解为 CTE)也无济于事。也许我错过了一些东西。
“无效子查询”是由于
UNION
造成的。另请注意,CONCAT_WS
的行为有所不同:对于 T-SQL,它会忽略 NULL
,对于 Snowflake,任何 NULL
都会导致 NULL
返回。
我的尝试是使用
UNPIVOT
和LISTAGG
:
WITH Dataset AS
(
SELECT *
FROM (VALUES
('NY', 1, 0, 1),
('CA', 1, 1, 1),
('TX', 0, 0, 1)) X(State,Pens,Pencils,Papers)
)
SELECT State,LISTAGG(ItemType, ',') Items
FROM Dataset
UNPIVOT(Item FOR ItemType IN (Pens, Pencils, Papers))
WHERE Item = 1
GROUP BY State