首页 > 解决方案 > 比较两列与 SQL 匹配的行的差异

问题描述

我正在尝试比较当前 [日期] 与上一个 [日期] 的每个 [名称] 的 [销售额] 差异

这就是我得到的:

姓名 日期 销售量
安娜 12/15 100
约瑟夫 12/15 150
卡尔 12/15 50
安娜 12/14 20
约瑟夫 12/14 50
卡尔 12/14 200
安娜 12/13 50
约瑟夫 12/13 300
卡尔 12/13 100

这是我正在寻找的输出:

姓名 日期 销售量 区别
安娜 12/15 100 80
约瑟夫 12/15 150 100
卡尔 12/15 50 -150
安娜 12/14 20 -30
约瑟夫 12/14 50 -250
卡尔 12/14 200 100
安娜 12/13 50 0
约瑟夫 12/13 300 0
卡尔 12/13 100 0

我是 SQL 服务器的新手,我认为我需要使用 CASE 语句,感谢帮助!

标签: sql-server

解决方案


您在这里想要的是在 上进行LAG分区name,并定义了默认值(这是第三个参数)。我还假设您的专栏date是一个date(因为有这样的名称,为什么不是),尽管您的示例数据表明它不是(如果不是,则需要修复):

SELECT name,
       date,
       sales,
       sales - LAG(sales,1,sales) OVER (PARTITION BY name ORDER BY date ASC) as difference
FROM (VALUES('ana    ',CONVERT(date,'2/15/2020',101), 100),
            ('Joseph ',CONVERT(date,'2/15/2020',101), 150),
            ('Carl   ',CONVERT(date,'2/15/2020',101), 50),
            ('ana    ',CONVERT(date,'2/14/2020',101), 20),
            ('Joseph ',CONVERT(date,'2/14/2020',101), 50),
            ('Carl   ',CONVERT(date,'2/14/2020',101), 200),
            ('ana    ',CONVERT(date,'2/13/2020',101), 50),
            ('Joseph ',CONVERT(date,'2/13/2020',101), 300),
            ('Carl   ',CONVERT(date,'2/13/2020',101), 100))YourTable(name,date,sales)
ORDER BY date DESC,
         name ASC;

推荐阅读