Sql server 找出谁没有在月度账单系统中付款
我正在创建一个管理店铺租金的系统。我有4张桌子:顾客、商店、合同、付款 这是四张表: 顾客:Sql server 找出谁没有在月度账单系统中付款,sql-server,vb.net,winforms,sql-server-2014,Sql Server,Vb.net,Winforms,Sql Server 2014,我正在创建一个管理店铺租金的系统。我有4张桌子:顾客、商店、合同、付款 这是四张表: 顾客: CREATE TABLE [dbo].[customers]( [cust_id] [int] NOT NULL, [name] [nvarchar](50) NULL, [nickname] [nvarchar](50) NULL, [city] [nvarchar](50) NULL, [phone1] [nvarchar](15) NULL, [ph
CREATE TABLE [dbo].[customers](
[cust_id] [int] NOT NULL,
[name] [nvarchar](50) NULL,
[nickname] [nvarchar](50) NULL,
[city] [nvarchar](50) NULL,
[phone1] [nvarchar](15) NULL,
[phone2] [nvarchar](15) NULL,
[phone3] [nvarchar](15) NULL,
[email] [nvarchar](50) NULL,
[image] [varbinary](max) NULL,
[date] [date] NULL,
[image_exist] [nvarchar](5) NULL,
商店:
CREATE TABLE [dbo].[shops](
[shop_id] [int] NOT NULL,
[size] [nvarchar](5) NULL,
[floor] [nvarchar](10) NULL,
[location] [nvarchar](50) NULL,
[status] [nvarchar](10) NULL,
[date] [date] NULL,
合同:
CREATE TABLE [dbo].[contracts](
[con_id] [int] NOT NULL,
[cust_id] [int] NULL,
[shop_id] [int] NULL,
[con_duration] [nvarchar](5) NULL,
[price] [nvarchar](50) NULL,
[con_use] [nvarchar](20) NULL,
[rent_type] [nvarchar](10) NULL,
[price2] [nvarchar](50) NULL,
[note2] [nvarchar](max) NULL,
[image] [image] NULL,
[date_start] [date] NULL,
[date_end] [date] NULL,
[note] [nvarchar](max) NULL,
[image_exist] [nvarchar](5) NULL,
付款:
CREATE TABLE [dbo].[payments_monthly](
[id] [int] IDENTITY(1,1) NOT NULL,
[con_id] [int] NULL,
[pay_number] [nvarchar](50) NULL, \\ i get the duration from contact and make numbers of payments, if the duration was 12 then the pay_number will be 1,2,3,.....,12- so the customers need to pay 12 time , one time per month
[pay_value] [decimal](18, 0) NULL, \\ amount of payment
[pay_type] [nvarchar](50) NULL,
[ch_number] [int] NULL,
[note] [nchar](10) NULL,
[date] [date] NULL,
因此,我需要的是获得所有未在本月或用户选择的特定月份付款的客户注意:并非所有客户都必须在同一日期付款,可能有些客户需要在2017年9月10日或2017年9月20日付款,因此我需要所有必须在2017年9月1日至2017年9月30日付款的客户
所以我需要在我的表中更改什么来实现我的目标,或者查询
我正在做一个项目来管理一组商店,这些商店租了一段时间,所以合同是6个月,12个月,18或24个月。。。等
有两种类型的合同:
1-合同为一定期限,付款为一次
2-合同为一定期限,每月支付一定金额的款项
例如:
1:12000美元,为期12个月-一次支付,存储在付款表中
合同2:12个月12000美元-支付多次-付款如下12000/12=每月1000美元存储在每月付款表中
该方案的工作如下:
租户表
还有一张出租商店的桌子
客户和商店场所之间有联系的合同表
之后,每月付款和每年付款的两个表格。记录与客户和商店相关的每个合同的付款
我认为下面的例子可能会给你一些提示
DECLARE @PaymentMonth INT
-- For Semptember 2017 set the variable to
SET @PaymentMonth = 201709
-- For March 2016 set the variable to
-- SET @PaymentMonth = 201603
SELECT c.Name
FROM customers cust
INNER JOIN contracts cont ON cust.cust_id = cont.cust_id
LEFT JOIN payments_monthly p ON cont.con_id = p.con_id
WHERE DATEPART(year, p.date) * 100 + DATEPART(month, p.date) <> @PaymentMonth
如果他们迟到了,同时付了两个月的钱,那么9月1日你就可以得到8月和9月的付款了?传统的会计系统也会有一个发票表,其中每个月都会创建一张新发票,并且在付款时会应用到相应的发票上。那么,寻找未结发票就很简单了 下面是我如何创建一个简单的发票表:
CREATE TABLE invoices (
ID INT IDENTITY(1,1) PRIMARY KEY
, con_id INT FOREIGN KEY REFERENCES dbo.Invoices(con_id)
, invoice_date DATETIME NOT NULL DEFAULT GETDATE()
, payment_id INT FOREIGN KEY REFERENCES dbo.payments(id)
)
它引用了合同和付款记录。在每个月的第一天,运行一个流程,自动为每个活动合同生成新发票。然后,当收到付款时,将付款ID添加到发票中,以便您知道它已付款
不过,这是一个相当简单的系统,因为它假设一张发票只能支付一笔款项,这只有在没有人支付部分款项的情况下才有意义。更好的选择是创建另一个在付款和发票之间具有多对多关系的表:
CREATE TABLE invoice_payments (
ID INT IDENTITY(1,1) PRIMARY KEY
, invoice_id INT FOREIGN KEY REFERENCES dbo.invoices(ID)
, payment_id INT REFERENCES dbo.payments(id)
, DateCreated DATETIME NOT NULL DEFAULT GETDATE()
)
现在,您可以将任意数量的付款应用于任意数量的发票,并且您可以创建一个查询,将所有发票和所有付款相加,以确保客户已支付其所有债务 逻辑似乎相当简单。选择所需的客户详细信息,其中合同表中存在一个条目,该条目的开始日期在该月的第一个月之前,结束日期在该月的第一个月之后,并且付款表中不存在该月的条目。您尝试了哪些不起作用的内容?@ZLK感谢您的重播,您能帮我完成select语句吗?是的,同意这一点。仅仅查看最后一个付款日期并不能说明他们的总付款是否是最新的。“我们可以实时计算到目前为止所欠的所有款项,但这效率很低。@Russell Fox,因此您建议创建新的表发票,当客户支付月值时,在新表中存储新的详细信息。好的,我认为如果用户还想打印一张旧的账单,这会更好。但是你能给我解释一下这是如何解决我想要达到的目标的吗。感谢you@Russell福克斯,请帮忙:对不起@Rabeeaqabaha,我刚刚来到我的电脑前:我用一些关于如何完成你需要的东西的例子来扩展我的答案。您仍然需要创建一个存储过程来自动生成发票,因此如果您也需要帮助,请告诉我们。当然,你需要一个用户可以输入此类信息的界面,除非你自己在后端输入。此外,如果合同金额发生变化,最好将价格添加到发票中。