我需要制作一个程序来计算水费。以下是我创建的表定义:
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 表中插入一行。例如,我想指定的值NowData
,PerviousData
,[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)
结果如下:
您可以使用 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)
归档时间: |
|
查看次数: |
1791 次 |
最近记录: |