如何获取 SQL Server 2008 中的最后一个值

0 sql-server

我需要制作一个程序来计算水费。以下是我创建的表定义:

CusAdd_Table 
    Id,
    Name,
    Phone,
    FamilyNo,
    City,
    SubscribeDate   

Calu_Table    
    NowData,
    PerviousData,
    Diff,
    MonthtBill,
    money, 
    id
Run Code Online (Sandbox Code Playgroud)

Diff列计算为NowData-PerviousData。该id列是对 的引用CusAdd_Table。该Money列的计算有一些差异。该MonthtBill列是用于排序的 dataTimepicker。

我的表结构能够轻松地向数据库添加新订阅者。当我添加一个月的新账单时,我会在 Calu_Table 表中插入一行。例如,我想指定的值NowDataPerviousData[NowData-PerviousData] as Diff用于插入数据时的列Jan。我需要插入额外的行来为Feb和插入数据Mar

我想打印上个月的数据,但代码需要在不知道订阅者数量的情况下工作。我尝试了下面的代码,但它不满足我的要求,因为我希望每个Id都有它的最后一个值。

SELECT
CusAdd.CusID AS Expr1,
CusAdd.CusName, 
CusAdd.CusPhone,
CusAdd.CusFamily, 
CusAdd.CusCity,
CusAdd.CusSubscribe,
Calculte_Table.Months,
Calculte_Table.NowRead,
Calculte_Table.ExRead,
Calculte_Table.Esthlak,
Calculte_Table.WhatHePay,
Calculte_Table.Dis_Money,
Calculte_Table.MonthtBill
FROM Calculte_Table 
INNER JOIN CusAdd ON Calculte_Table.CusID = CusAdd.CusID
ORDER BY Calculte_Table.MonthtBill DESC;
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此处输入图片说明

Aar*_*and 5

您可以使用 CTE(或子查询)来确定每个客户的最新行,然后过滤外部查询中的行。考虑使用更清晰的格式(制表符和回车是你的朋友)、表别名,并始终使用模式前缀

;WITH x AS 
(
  SELECT 
    c.CusID, 
    rn = ROW_NUMBER() OVER (PARTITION BY c.CusID ORDER BY ct.MonthBill DESC)
    c.CusName, 
      ... all those other columns ...
    ct.MonthtBill
  FROM
    dbo.Calculte_Table AS ct
  INNER JOIN
    dbo.CusAdd AS c
    ON ct.CusID = c.CusID
)
SELECT CusID, CusName, ... all those other columns ...
FROM x
WHERE rn = 1
ORDER BY MonthtBill DESC;
Run Code Online (Sandbox Code Playgroud)