首页 > 解决方案 > 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

?

格式化此行以提高可读性的最佳方法是什么?

标签: sqlsql-server

解决方案


欢迎来到 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。如果是这样,我认为它在内部看起来更具可读性,因为您将所有开括号都靠近它们的闭括号。

我并不是说这些中的任何一个更好或更坏。这是一个见仁见智的问题。但是当可读性成为问题时,这些是常用的工具。


推荐阅读