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')
 
 

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,以避免除以零的错误。

1 9
2 1.38
3 1.60 这个是什么意思呢?

使用子查询和ORDER BY子句对查询结果进行排序:

SELECT num1/num2 AS result
FROM (
    SELECT 2.88 AS num1, 0.32 AS num2
    UNION
    SELECT 3.99 AS num1, 2.88 AS num2
    UNION
    SELECT 6.39 AS num1, 3.99 AS num2
) AS t
ORDER BY result DESC

上述SQL语句中,首先定义了一个子查询,用于查询需要进行相除的数字。

题主把问题描述的清楚一些,你的题意和数据库表结构没有对应关系

jiyugpt
你可以使用SQL Server中的SELECT语句来进行相除求值并排序的操作。以下是示例代码:

SELECT [序号], [AA]/[BB] AS Result
FROM [GP_GPDMB_TMP9]
ORDER BY [序号]

这个查询语句会将表中的每一行的AA列的值除以BB列的值,并将结果作为Result列返回。最后,根据序号列进行排序。

运行上述查询后,将会得到以下结果:

序号  Result
--------------
1     0.330
2     1.193
3     0.703
4     0.766

注意,如果你需要结果的小数位数精确到两位,你可以使用CAST或者CONVERT函数来指定精度。以下是修改后的查询语句:

SELECT [序号], CAST([AA]/[BB] AS DECIMAL(18,2)) AS Result
FROM [GP_GPDMB_TMP9]
ORDER BY [序号]

这将返回结果:

序号  Result
--------------
1     0.33
2     1.19
3     0.70
4     0.76