【问题标题】:SQL add column to table base another column and rowSQL将列添加到表基础上的另一列和行
【发布时间】:2019-05-01 08:29:32
【问题描述】:

我创建了一个表格来显示年份和月份的总收入,如果之后的总收入大于之前的 10%,我想在表格中添加一列。

我试过了:

select DATEPART(YEAR, OrderDate) AS OrderYear,
DATEPART(MONTH, OrderDate) AS OrderMonth,
ROUND(SUM(UnitPrice*Quantity-Discount),2) AS Total_Revenue,
case when   SUM(UnitPrice*Quantity-Discount)  > 10 THEN '>10' ELSE '<=10' end  my_col
FROM [Order Details], Orders
WHERE Orders.OrderID = [Order Details].OrderID
GROUP BY DATEPART(YEAR, OrderDate), DATEPART(MONTH, OrderDate)
ORDER BY DATEPART(YEAR, OrderDate), DATEPART(MONTH, OrderDate)

我明白了:

我需要得到:

问题是我需要计算上一行和当前行之间的变化百分比,我该怎么做呢?

【问题讨论】:

  • 这看起来很像家庭作业...?
  • 这是一个家庭作业,我试过了,但没有成功。
  • 这个网站不是用来解决家庭作业的。您需要自己弄清楚这些事情,否则您将学不会。我将为您提供的帮助是查看 laglead 函数。
  • @iamdave OP 实际上在这里分享了他们的尝试,所以我建议这是主题。帮助页面上写着“请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作的总结,以及您在解决问题时遇到的困难的描述。” 他们'已经向我们展示了他们尝试了什么,以及他们追求的结果。没错,他们追求的是LEADLAG。 Eliad,我建议阅读LAG 上的文档并展示您的新尝试。如果您不理解语法,请在问题中添加有关您不理解的内容的详细信息。

标签: sql sql-server northwind


【解决方案1】:

您可以使用LAG()。我会推荐一个子查询,以简化命名:

select ym.*,
       (case when Total_Revenue > 1.1 * lag(Total_Revenue) over (order by orderyear, ordermonth)
             then 'Reached'
             else 'Missed'
        end)
from (select DATEPART(YEAR, o.OrderDate) AS OrderYear,
             DATEPART(MONTH, o.OrderDate) AS OrderMonth,                
     ROUND(SUM(od.UnitPrice * od.Quantity - od.Discount), 2) AS Total_Revenue
      from [Order Details] od join
           Orders o
           on o.OrderID = od.OrderID
      group by DATEPART(YEAR, o.OrderDate), DATEPART(MONTH, o.OrderDate)
     ) ym
order by orderyear, ordermonth;

注意事项:

  • 切勿FROM 子句中使用逗号。
  • 始终使用正确、明确的标准JOIN语法。
  • 使用表别名,即表名的缩写。
  • 限定所有列引用,尤其是当您的查询引用多个表时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 2017-03-02
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多