sql - SQL 这个速记是一样的吗?SQL 可读性
问题描述
我有一条看起来像这样的简单线
,SUM(CASE WHEN Unit_MarkDown <> 0 THEN 1 ELSE 0 END) OVER (Partition BY Company_Code, Division_Code, Control_Number, Customer_Purchase_Order_Number) /
NULLIF(MAX (AMT.Odet_Line_Number) OVER (PARTITION BY AMT.Company_Code,AMT.Division_Code, AMT.Customer_Purchase_Order_Number),0) AS OrderMarkdownedLinesPercent
这和写的一样吗
,SUM(CASE WHEN Unit_MarkDown <> 0 THEN 1 ELSE 0 END) / NULLIF(MAX (AMT.Odet_Line_Number),0) OVER (Partition BY Company_Code, Division_Code, Control_Number, Customer_Purchase_Order_Number) AS OrderMarkdownedLinesPercent
?
格式化此行以提高可读性的最佳方法是什么?
解决方案
欢迎来到 StackOverflow!你有两个问题。首先是您提供的两个版本的代码是否等效。这很容易测试,所以我将把这个留给你自己回答。
但第二个,关于可读性,我可以提供以下替代格式:
select *,
OrderMarkdownedLinesPercent =
sum(ap.hasMarkdown) over (partition by ap.combined)
/ max(nullif(odet_line_number,0)) over (partition by ap.combined)
from someTable
cross apply (select
combined =
company_code + '.' +
division_code + '.' +
control_number + '.' +
customer_Purchase_Order_Number,
hasMarkdown = iif(Unit_MarkDown <> 0, 1, 0)
) ap
它有以下好处:
- 代码是垂直的。在查看代码溢出时,编码人员必须垂直滚动比水平滚动要容易得多。
- 使用交叉应用允许 Unit_Markdown 的两步逻辑在交叉应用内部的验证逻辑和它外部的聚合逻辑之间更明显地分开。
- 使用 cross apply 来计算
combined
消除了分区子句中的一些冗余。这可能性能较差。但是测试它,如果它不是很多,那么值得提高可读性。 - 的使用
iif
并不总是比 更具可读性case
,但我将其放入只是为了展示它,假设它在您的版本中可用。 - 使用
=
Sql Server 允许您先命名列,然后描述其计算。我发现这在可读性方面非常有利,而且并非所有方言都有它太糟糕了。 - 有时我发现将二元运算符放在新行的开头比放在末尾更易读。有时我不会。你可以在这里看到这两种风格。
- 我可能弄错了,但它应该相当于把你的
nullif
函数放在函数里面max
。如果是这样,我认为它在内部看起来更具可读性,因为您将所有开括号都靠近它们的闭括号。
我并不是说这些中的任何一个更好或更坏。这是一个见仁见智的问题。但是当可读性成为问题时,这些是常用的工具。
推荐阅读
- java - 令牌包含空格字符“/”,由于它的使用,我需要存储字符串
- laravel - 如何在 laravel 中按国家、按设备和活跃用户获取会话?
- oop - Dart:泛型抽象静态方法
- ios - Xcode, Swift - 我可以在伞形框架中隐藏框架吗?
- laravel - 使用 Mail::to() 的多个电子邮件地址
- html - 基于滚动位置的 CSS 最大高度
- javascript - 如何从此 javascript 代码中获取复合值?
- python - 是否可以将对象或变量从测试函数传递到函数夹具?
- ssas - 表格项目的 SSAS 集成环境
- matlab - 使用 MATLAB spectrogram() 绘制频率 (Hz) 与时间 (sec) 的关系图