billrolbin 2023-05-19 21:32 采纳率: 80.8%
浏览 92
已结题

sql server 查询相除求值并排序

我想实现下面计算的值 ,这个SQL 如何写呢?


 1   2.88/0.32
 2   3.99/2.88
 3   6.39/3.99


 1   9
 2   1.38
 3   1.60

下面是表结构和表数据,用于测试。


if exists (select * from sysobjects where id = OBJECT_ID('[GP_GPDMB_TMP9]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) 
DROP TABLE [GP_GPDMB_TMP9]
 
CREATE TABLE [GP_GPDMB_TMP9] (
[序号] [bigint]  NULL,
[AA] [decimal]  (18,2) NULL,
[BB] [decimal]  (18,2) NULL,
[CC] [varchar]  (50) NULL)
 
INSERT [GP_GPDMB_TMP9] ([序号],[AA],[BB],[CC]) VALUES ( 1,0.32,0.97,N'001')
INSERT [GP_GPDMB_TMP9] ([序号],[AA],[BB],[CC]) VALUES ( 2,2.88,2.41,N'002')
INSERT [GP_GPDMB_TMP9] ([序号],[AA],[BB],[CC]) VALUES ( 3,3.99,5.68,N'003')
INSERT [GP_GPDMB_TMP9] ([序号],[AA],[BB],[CC]) VALUES ( 4,6.39,8.35,N'004')
 
 
  • 写回答

5条回答 默认 最新

  • PhoenixRiser 2023-05-19 21:48
    关注

    TechWhizKid参考GPT回答:

    • 想要计算每一行AA列的值除以前一行AA列的值。以下是一个可能的SQL查询实现:
    WITH CTE AS (
        SELECT 
            [序号], 
            [AA],
            LAG([AA]) OVER (ORDER BY [序号]) AS previous_AA
        FROM 
            [GP_GPDMB_TMP9]
    )
    SELECT 
        [序号],
        CASE 
            WHEN previous_AA = 0 THEN NULL -- 在前一个AA值为0的情况下,避免除以0的错误
            ELSE [AA] / previous_AA 
        END AS result
    FROM 
        CTE
    ORDER BY 
        [序号]
    
    

    使用窗口函数LAG()来获取每一行的前一行AA列的值。然后,查询计算AA列的值除以其前一行的值。如果前一行的值为0,查询将返回NULL,以避免除以零的错误。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月28日
  • 已采纳回答 5月20日
  • 创建了问题 5月19日

悬赏问题

  • ¥15 对回溯算法进行剪枝操作
  • ¥15 安全模式下,用户没有C盘所有权限
  • ¥15 grbl怎么清除一条命令?
  • ¥60 用继电器控制道闸开闸
  • ¥15 grbl移动过程中,发送“!"停止,进入Hold状态,怎么解除?
  • ¥15 wpf中自己实现sorting,每一次都是升序排列
  • ¥15 odoo17中,产品分包路线如何设置?可从销售订单中直接触发采购订单及相关单据
  • ¥15 请教下win10wx和麒麟wx无法互通俩者数据并不兼吗,如何解决?(标签-linux)
  • ¥15 永劫无间游戏如何实现微加速 或者说游戏优化(玩家)
  • ¥15 手机ios升级依赖后app闪退