【问题标题】:query to get all not fully paid invoices查询以获取所有未全额支付的发票
【发布时间】:2021-05-01 05:33:13
【问题描述】:

我有这些表invoices,payments,payments_detailsinvoices 表有在创建合同时创建的用户应支付的所有发票,该合同可能有 1 个或更多发票,付款表包含合同的所有付款(用户可以为每张发票支付多笔付款),最后一个表payments_detailspayments 表中包含每笔付款的详细信息。付款可能有不同的付款方式,例如现金,或现金和签证,或现金和签证和支票。我通过从 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


    【解决方案1】:

    我相信类似下面的内容应该可以满足您的需求。我假设 [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);
    

    OUTER APPLY 将为您提供发票的所有 payment_details SUM。我们使用 OUTER APPLY 来处理没有付款的发票,然后在 where 子句中使用 COALESCE

    没有样本数据我无法测试。

    【讨论】:

      【解决方案2】:

      试试这个:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-01
        • 1970-01-01
        • 2014-04-01
        相关资源
        最近更新 更多