Sql server 查询以获取所有未全额支付的发票

Sql server 查询以获取所有未全额支付的发票,sql-server,tsql,Sql Server,Tsql,我有以下表格发票,付款,付款详情,发票表格包含创建合同时用户应支付的所有发票,此合同可能有一张或多张发票,付款表格包含合同的所有付款(用户可以为每张发票支付多笔款项)最后一个表payments\u details在payments表中有每笔付款的详细信息,例如,付款可能有不同的付款方式,如现金、现金和visa卡,或chash和visa卡以及支票。我通过从payments\u details`中获得付款方式值的总和来获得付款值,这是我的表文字: CREATE TABLE [dbo].[invoic

我有以下表格
发票
付款
付款详情
发票
表格包含创建合同时用户应支付的所有发票,此合同可能有一张或多张发票,付款表格包含合同的所有付款(用户可以为每张发票支付多笔款项)最后一个表
payments\u details
payments
表中有每笔付款的详细信息,例如,付款可能有不同的付款方式,如现金、现金和visa卡,或chash和visa卡以及支票。我通过从payments\u 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
以下是数据库的图表:

我想从
发票
中获取未在
付款中全额付款的所有发票
以下是我所做的测试:

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 
试试这个:

SELECT inv.ID, inv.con_id, inv.due_date 
FROM invoices inv
LEFT OUTER JOIN payments pay ON pay.inv_id = inv.ID
LEFT OUTER JOIN payments_details pd ON pd.pay_id = pay.ID
GROUP BY inv.ID, inv.con_id, inv.due_date, inv.value
HAVING SUM(ISNULL(pd.value, 0)) < inv.value
选择库存标识、库存控制标识、库存到期日
从发票库存
左外部联接付款付款付款付款付款日期:pay.inv\u id=inv.id
左侧外部联接付款详细信息pd上的pd.pay\U id=pay.id
按库存标识、库存控制标识、库存到期日、库存价值分组
具有总和(ISNULL(pd.value,0))
试试这个:

SELECT inv.ID, inv.con_id, inv.due_date 
FROM invoices inv
LEFT OUTER JOIN payments pay ON pay.inv_id = inv.ID
LEFT OUTER JOIN payments_details pd ON pd.pay_id = pay.ID
GROUP BY inv.ID, inv.con_id, inv.due_date, inv.value
HAVING SUM(ISNULL(pd.value, 0)) < inv.value
选择库存标识、库存控制标识、库存到期日
从发票库存
左外部联接付款付款付款付款付款日期:pay.inv\u id=inv.id
左侧外部联接付款详细信息pd上的pd.pay\U id=pay.id
按库存标识、库存控制标识、库存到期日、库存价值分组
具有总和(ISNULL(pd.value,0))
我相信下面这样的内容应该可以满足您的需要。我假设[invoices]表中的[value]是发票的总金额

SELECT      [inv].[ID]
          , [inv].[con_id]
          , [inv].[due_date]
FROM        [invoices] [inv]
OUTER APPLY (
                SELECT     SUM([pd].[value]) AS [TotalPayments]
                FROM       [payments] [pay]
                INNER JOIN [payments_details] [pd]
                    ON [pd].[pay_id] = [pay].[ID]
                WHERE      [pay].[inv_id] = [inv].[ID]
            ) AS [paymnts]
WHERE       [inv].[value] <> COALESCE([paymnts].[TotalPayments], 0);
选择[inv].[ID]
,[inv].[con_id]
,[inv]。[到期日]
来自[发票][inv]
外敷(
选择SUM([pd].[value])作为[TotalPayments]
从[付款][支付]
内部联接[付款详情][pd]
在[pd].[pay_id]=[pay].[id]上
其中[pay].[inv\U id]=[inv].[id]
)作为[报酬]
其中[inv].[value]合并([paymnts].[TotalPayments],0);
OUTER APPLY将为您获取发票的所有付款详细信息。我们使用OUTER APPLY对未付款的发票进行记帐,然后在where子句中使用


如果没有样本数据,我无法对其进行测试。

我相信下面的内容应该可以满足您的需要。我假设[invoices]表中的[value]是发票的总金额

SELECT      [inv].[ID]
          , [inv].[con_id]
          , [inv].[due_date]
FROM        [invoices] [inv]
OUTER APPLY (
                SELECT     SUM([pd].[value]) AS [TotalPayments]
                FROM       [payments] [pay]
                INNER JOIN [payments_details] [pd]
                    ON [pd].[pay_id] = [pay].[ID]
                WHERE      [pay].[inv_id] = [inv].[ID]
            ) AS [paymnts]
WHERE       [inv].[value] <> COALESCE([paymnts].[TotalPayments], 0);
选择[inv].[ID]
,[inv].[con_id]
,[inv]。[到期日]
来自[发票][inv]
外敷(
选择SUM([pd].[value])作为[TotalPayments]
从[付款][支付]
内部联接[付款详情][pd]
在[pd].[pay_id]=[pay].[id]上
其中[pay].[inv\U id]=[inv].[id]
)作为[报酬]
其中[inv].[value]合并([paymnts].[TotalPayments],0);
OUTER APPLY将为您获取发票的所有付款详细信息。我们使用OUTER APPLY对未付款的发票进行记帐,然后在where子句中使用

没有样本数据,我无法测试它