【问题标题】:Multiple subquery join in View with group by returns duplicate rowsView 中的多个子查询连接与 group by 返回重复的行
【发布时间】:2019-08-23 06:30:43
【问题描述】:

我已经使用子查询创建了一个视图,但我希望这个视图返回一些不能按子查询添加到组中的补充列,所以我必须再创建一个选择语句并通过子查询与其他组加入

我想出了以下查询, 但我面临的问题是,如果按卖家分组有 28 行,它会返回 28 个重复行,我也希望整个查询按 TotalOrderItem 排序。

Alter VIEW [dbo].[SellersPerformance] AS


Select 
    RequiredColumns.Id as Id,
    aggrgateDT.SellerId as SellerId,
    aggrgateDT.TenantId as TenantId,
    aggrgateDT.Active as Active,
    aggrgateDT.TotalOrderedItem as TotalOrderItem,
    aggrgateDT.MoveToPurchase as MoveToPurchase,
    aggrgateDT.GoodPurchase as GoodPurchase,
     RequiredColumns.Created as Created,
    RequiredColumns.Modified as Modified,
    RequiredColumns.CreatorId as CreatorId,
    RequiredColumns.ModifierId as ModifierId


 From
 (
(Select 
sellerId, p.TenantId, p.Active, count(*) as TotalOrderedItem, 
   count(*) - count(o.Id) as MoveToPurchase,
       count(o.Id) as GoodPurchase,
  count(case when o.ApplicationStatus = 'Perfect' then 1 end) as Perfect,
     count(case when o.ApplicationStatus = 'R-Perfect' then 1 end) as R_Perfect

  FROM [dbo].[AmazonOrderPurchaseInfo] p
  left join [dbo].[AmazonOrder] o
  on p.AmazonOrderId = o.Id
    AND p.Id = o.[AmazonOrderPurchaseInfoId]
  group by SellerId, p.TenantId, p.Active
 order by TotalOrderedItem offset 0 rows
) aggrgateDT

 Left outer Join (
 SELECT 
       NEWID() Id,
       purchase.Created     AS Created,
       purchase.Modified    AS Modified,
       purchase.CreatorId   AS CreatorId,
       purchase.ModifierId  AS ModifierId,
       purchase.SellerId      As SellerId

       From dbo.AmazonOrderPurchaseInfo purchase

 ) RequiredColumns ON aggrgateDT.SellerId = RequiredColumns.SellerId

 )

GO

【问题讨论】:

  • 选择 distinct 怎么样?
  • @metal 试过明显它不起作用
  • 轻松为您提供帮助:minimal reproducible example.
  • 样本数据和期望的结果会有所帮助,尤其是简化示例。

标签: sql sql-server group-by sql-view


【解决方案1】:

你可以试试Group by

Alter VIEW [dbo].[SellersPerformance] AS

select res.Id, res.SellerId, res.TenandId, res.Active, res.TotalOrderItem, res.MovetoPurchase, res.GoodPurchase, res.Created, res.Modified, res.CreatorId, res.ModifierId
from

(

Select 
    RequiredColumns.Id as Id,
    aggrgateDT.SellerId as SellerId,
    aggrgateDT.TenantId as TenantId,
    aggrgateDT.Active as Active,
    aggrgateDT.TotalOrderedItem as TotalOrderItem,
    aggrgateDT.MoveToPurchase as MoveToPurchase,
    aggrgateDT.GoodPurchase as GoodPurchase,
     RequiredColumns.Created as Created,
    RequiredColumns.Modified as Modified,
    RequiredColumns.CreatorId as CreatorId,
    RequiredColumns.ModifierId as ModifierId


 From
 (
(Select 
sellerId, p.TenantId, p.Active, count(*) as TotalOrderedItem, 
   count(*) - count(o.Id) as MoveToPurchase,
       count(o.Id) as GoodPurchase,
  count(case when o.ApplicationStatus = 'Perfect' then 1 end) as Perfect,
     count(case when o.ApplicationStatus = 'R-Perfect' then 1 end) as R_Perfect

  FROM [dbo].[AmazonOrderPurchaseInfo] p
  left join [dbo].[AmazonOrder] o
  on p.AmazonOrderId = o.Id
    AND p.Id = o.[AmazonOrderPurchaseInfoId]
  group by SellerId, p.TenantId, p.Active
 order by TotalOrderedItem offset 0 rows
) aggrgateDT

 Left outer Join (
 SELECT 
       NEWID() Id,
       purchase.Created     AS Created,
       purchase.Modified    AS Modified,
       purchase.CreatorId   AS CreatorId,
       purchase.ModifierId  AS ModifierId,
       purchase.SellerId      As SellerId

       From dbo.AmazonOrderPurchaseInfo purchase

 ) RequiredColumns ON aggrgateDT.SellerId = RequiredColumns.SellerId

) as res
 group by  res.Id, res.SellerId, res.TenandId, res.Active, res.TotalOrderItem, res.MovetoPurchase, res.GoodPurchase, res.Created, res.Modified, res.CreatorId, res.ModifierId

 )

GO


如果Id, Created, Modified, CreatorId, ModifierId 列具有相同的 id,那么您可能会得到预期的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多