【发布时间】:2021-05-01 05:33:13
【问题描述】:
我有这些表invoices,payments,payments_details,invoices 表有在创建合同时创建的用户应支付的所有发票,该合同可能有 1 个或更多发票,付款表包含合同的所有付款(用户可以为每张发票支付多笔付款),最后一个表payments_details 在payments 表中包含每笔付款的详细信息。付款可能有不同的付款方式,例如现金,或现金和签证,或现金和签证和支票。我通过从 payment_details 获取支付方式值的总和来获取支付值,这是我的表格脚本:
CREATE TABLE [dbo].[invoices](
[ID] [int] IDENTITY(1,1) NOT NULL,
[con_id] [int] NOT NULL,
[value] [decimal](10, 2) NOT NULL,
[due_date] [date] NULL,
[date] [date] NULL,
CONSTRAINT [PK_due_payments] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[payments] Script Date: 30/04/2021 09:45:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[payments](
[ID] [int] IDENTITY(1,1) NOT NULL,
[inv_id] [int] NULL,
[note] [nvarchar](max) NULL,
[date] [date] NULL,
[app_user] [nvarchar](20) NULL,
CONSTRAINT [PK_invoices] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
/****** Object: Table [dbo].[payments_details] Script Date: 30/04/2021 09:45:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[payments_details](
[ID] [int] IDENTITY(1,1) NOT NULL,
[pay_id] [int] NOT NULL,
[value] [decimal](10, 2) NULL,
[method] [nvarchar](20) NULL,
[date] [date] NULL,
CONSTRAINT [PK_Payment_yearly_details] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
我想从invoices 获得所有未在payments 中全额支付的发票。
这是我在测试中所做的:
select inv.ID,inv.con_id,inv.due_date
from invoices inv
cross apply(
select inv_id from payments pay) payy
cross apply(
select coalesce(sum(pd.value), 0) as paid
from payments_details pd group by pd.pay_id) pdd
where inv.ID = payy.inv_id and inv.value != pdd.paid group by inv.ID, inv.con_id,inv.due_date
【问题讨论】:
标签: sql-server tsql