首页 > 解决方案 > 将递归/循环 Excel 逻辑转换为 SQL 语法

问题描述

问题描述

我有一个问题,我想将一些Excel/GSheet 逻辑转换为标准SQL 语法

硬编码值示例:

硬编码值示例

计算最终逻辑的公式:

计算最终逻辑的公式

第一个想法

这是带有逻辑的示例数据的链接:Google Sheet

如果您有任何提示或 SQL 的语法可以解决这个问题,请告诉我!谢谢 :)

标签: sqlexcelgoogle-sheetspsql

解决方案


我通过 sqlfiddle 创建了一个在 MS SQL Server 2017 上工作的递归cte

这是我的架构:

CREATE TABLE Test(
row_ID int IDENTITY(1,1) PRIMARY KEY,
cond_1 bit,
cond_2 bit,
cond_3 bit,
final_flag bit
);
-- I placed an initial false into the first row
INSERT INTO Test(cond_1, cond_2, cond_3, final_flag)
VALUES
(0, 0, 1, 0)
;

INSERT INTO Test(cond_1, cond_2, cond_3)
VALUES
(1, 0, 0),
(0, 1, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(1, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 1),
(1, 0, 0),
(0, 1, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(1, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0);

桌子:

桌子

询问:

WITH cte AS (
  -- anchor query
  SELECT row_ID, cond_1, cond_2, cond_3, final_flag
  FROM Test
  WHERE row_ID = 1

  UNION ALL
  -- recursive query
  SELECT This.row_ID, This.cond_1, This.cond_2, This.cond_3, 
         cast(case when This.cond_3|This.cond_2 = 1 then 0
                   else This.cond_1|Prev.final_flag
              end as bit) as final_flag
  FROM Test This, cte Prev
  WHERE This.row_id = Prev.row_id + 1
)
SELECT cond_1, cond_2, cond_3, final_flag FROM cte;

输出:

输出

笔记:

  • row_ID为了便于比较,我添加了一个列。您始终可以在输出中排除它们。
  • 您可能已经注意到我的最终标志计算与您的有点不同。我将您的公式简化=if(L3,false,if(K3,false,or(J3,M2)))为这样=IF(OR(K3,L3),FALSE,OR(M2,J3)),因此我只能使用 1条case语句,进一步简化了整个查询。
  • 结果不写入表中。随意根据输出更新表格。
  • 有关更多详细信息,请阅读使用 ctes 的递归 sql 查询。递归 sql 查询对我来说是非常新的,只需阅读该博客即可使其工作。

推荐阅读