You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存储过程去重需求:按公司保留指定发票行记录

问题描述

我正在开发一款存储过程(SP),用于生成特定会员类型的开票记录列表。目前先针对单个公司调试(后续将支持多会员类型,本次示例为'Buyer Membership')。

当前每个公司包含多个分支,每个分支会返回3条发票行描述记录:

Branch Monthly Membership
Buyer Monthly Membership
Carrying Charge

现有返回数据如下:

Company                                         Invoice Line
Id     CompanyName   MembershipType  BranchName Description
20     DeluxPainting BuyerMemberShip Branch1  Branch MonthlyMembership
20     DeluxPainting BuyerMemberShip Branch1  Buyer Monthly Membership
20     Deluxainting  BuyerMemberShip Branch1  Carrying Charge
20     DeluxPainting BuyerMemberShip Branch2  Branch MonthlyMembership
20     DeluxPainting BuyerMemberShip Branch2  Buyer Monthly Membership
20     DeluxPainting BuyerMemberShip Branch2  Carrying Charge
20     DeluxPainting BuyerMemberShip Branch3  Branch MonthlyMembership
20     DeluxPainting BuyerMemberShip Branch3  Buyer Monthly Membership
20     DeluxPainting BuyerMemberShip Branch3  Carrying Charge

我需要进一步处理数据,要求:

  • 每个公司仅保留1条'Buyer Monthly Membership'记录
  • 每个公司仅保留1条'Carrying Charge'记录
  • 每个分支保留1条'Branch Monthly Membership'记录

期望输出数据如下:

Company                                         Invoice Line
Id     CompanyName   MembershipType  BranchName Description
20     DeluxPainting BuyerMemberShip Branch1  Buyer Monthly Membership
20     Deluxainting  BuyerMemberShip Branch1  Carrying Charge
20     DeluxPainting BuyerMemberShip Branch1  Branch MonthlyMembership
20     DeluxPainting BuyerMemberShip Branch2  Branch MonthlyMembership
20     DeluxPainting BuyerMemberShip Branch3  Branch MonthlyMembership

始终无法实现这一最终需求(移除分支2和3的Buyer Monthly Membership与Carrying Charge记录),请问是否可行?恳请帮助。


更新内容

感谢协助,我添加了您建议的排名函数后,第一个查询能正常显示DescriptionGroup和BranchGroup,但第二个查询提示cteFinal为无效对象名。我尝试存入临时变量,或复制SP内容到新表后可执行简单查询,但希望按示例方式修复。请帮忙修正以下存储过程:

BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    with PCTE AS 
(
SELECT  Count(*) as Count, Companies.Id as companyid, Branches.id as branchid, c.name as InventoryCenter
FROM            dbo.InventoryItems INNER JOIN
                dbo.inventoryCategories on InventoryItems.inventoryCategoryID = inventoryCategories.id Inner JOIN
                dbo.InventoryCenters c on inventoryCategories.InventoryCenterId = c.Id INNER JOIN
                dbo.Branches ON InventoryItems.BranchId = Branches.Id INNER JOIN
                dbo.Companies ON Branches.CompanyId = Companies.Id
        WHERE 
          InventoryItems.Deleted = 'False'AND
          Branches.IsDeleted= 'False' AND
          Companies.IsDeleted = 'False'  AND
          IsShownToMembers = 'True' AND
          Companies.Id = 20 
        group by Companies.Id, Branches.id , c.name 

)
, CompanySummaryCTE AS
(
    select companyid, branchid, [Part Center], [Equipment Center], [Attachment Center], [Powertrain Center], [Salvage Center] 
        from PCTE
    PIVOT (Sum(Count) for InventoryCenter IN ([Part Center], [Equipment Center], [Attachment Center], [Powertrain Center], [Salvage Center] )) as P
)
, cteInvoices AS (
        select t.CompanyId, t.FirstRun, t.NextRun, f.DisplayedAs as Frequency
            , l.Description as InvoiceLineDescription, l.Quantity as InvoiceLineQuantity, l.DiscountAmount as InvoiceLineDiscount
            , l.ServiceId as InvoiceLineServiceId
            from RecurringInvoiceTemplates t
            inner join RecurringInvoiceFrequencies f on t.RecurringInvoiceFrequencyId = f.Id
            inner join RecurringInvoiceLines l on l.RecurringInvoiceTemplateId = t.Id
    )
, cteFinal AS (
    SELECT Companies.Id as CompanyId, Companies.Name AS CompanyName, p.Name as MembershipType,Branches.Name as BranchName, I.InvoiceLineDescription
    FROM   
    CompanySummaryCTE cte
    JOIN Companies ON cte.companyid = companies.Id
    JOIN Branches on Branches.CompanyId = Companies.Id
    JOIN CompanyProducts cp on companies.id = cp.companyid
    JOIN Products p on cp.ProductId = p.Id
    LEFT JOIN cteInvoices I on Companies.Id = i.CompanyId
    where 
    Companies.IsDeleted = 0
    and Branches.IsDeleted = 0
    and p.ProductTypeId = 2
) 

 --Original data with magic numbers added based on partition functions
SELECT DISTINCT * , 
DENSE_RANK() OVER (PARTITION BY BranchName ORDER BY BranchName, InvoiceLineDescription ) DescriptionGroup,
DENSE_RANK() OVER (PARTITION BY InvoiceLineDescription ORDER BY BranchName) BranchGroup
FROM cteFinal
WHERE 1=1
order by CompanyId 

--Insert into 

-- Once you have the magic numbers worked out, just filter out the rows you don't want
SELECT * FROM (
SELECT * , 
ROW_NUMBER() OVER (PARTITION BY BranchName ORDER BY BranchName, InvoiceLineDescription ) DescriptionGroup,
ROW_NUMBER() OVER (PARTITION BY InvoiceLineDescription ORDER BY BranchName) BranchGroup
FROM cteFinal
) F
WHERE F.BranchGroup = 1 OR F.DescriptionGroup = 1
--ORDER BY F.BranchName, F.InvoiceLineDescription
    

END

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:05:15