SQL - 仅显示重复记录的第一个实例中的一列的结果

时间:2017-03-29 09:46:18

标签: sql

我发现很难准确解释我想要实现的目标,所以我认为最好展示一个视觉表现。

Example of how my query results currently look

Example of how I want the results to look

我正在运行的报告显示订单中每件商品的清单。每种产品都有自己的成本。另一栏是送货费,但这是分配给订单的费用;不是个别产品。我希望能够仅针对每个订单中的第一个产品显示运费。

我已经尝试了很长时间,试图找到这个查询的答案,但没有运气。我不知道是否有可能,所以任何形式的帮助,甚至只是指向正确的方向,都会有很大的帮助。

由于

EDIT。

如果有帮助,这是我的疑问:

SELECT dbo.Orders.EncryptedOrderId,
       dbo.OrderProduct.ProductID,
       dbo.OrderProduct.QuantityPerRecipient,
       dbo.OrderProduct.NumRecipients,
       dbo.OrderProduct.TotalQuantity,
       dbo.DocType.Name AS [Product Type],
       dbo.ProductGroup_Culture.Name AS [Product Group],
       RIGHT(CatalogNo, CHARINDEX('_', REVERSE('_' + CatalogNo)) -1) AS [HamptonsType],
       FORMAT(dbo.Orders.DateOrderCreated, 'dd/MM/yyyy HH:mm:ss') AS 'DateOrderCreated',
       CAST(REPLACE(dbo.Orders.ClearingResult, 'utf-8', 'utf-16') AS XML ).value('(/UserData//CostCenter/node())[1]', 'nvarchar(max)') AS [Cost Center], 
       dbo.Users.FirstName, 
       dbo.Users.LastName, 
       dbo.Users.CompanyName AS [Branch Name], 
       dbo.Users.Department AS Subsidiary, 
       dbo.Users.Custom1, 
       dbo.Users.Custom2, 
       dbo.Users.Custom3, 
       dbo.Users.Custom4, 
       dbo.Users.Custom5, 
       dbo.OrderProduct.TotalPrice,
       dbo.Orders.ShippingCharges,
       dbo.OrderProduct.OrderProductID, 
       dbo.FileSubmissionDocument.OriginalFileType, 
       COALESCE (dbo.FileSubmissionDocument.Title, dbo.Product_Culture.Name) AS [Product Name],
       OPDV.FriendlyValue AS 'BCard Recipient'
FROM dbo.DocType
INNER JOIN dbo.Doc
    ON dbo.DocType.DocTypeID = dbo.Doc.DocTypeID
INNER JOIN dbo.OrderProduct
    ON dbo.Doc.ProductID = dbo.OrderProduct.ProductID
LEFT JOIN dbo.Product
    ON dbo.Product.ProductID = dbo.Doc.ProductID
LEFT JOIN dbo.ProductGroupMembership
    ON dbo.ProductGroupMembership.ProductID = dbo.Doc.ProductID
LEFT JOIN dbo.ProductGroup_Culture
    ON dbo.ProductGroup_Culture.ProductGroupID = dbo.ProductGroupMembership.ProductGroupID
INNER JOIN dbo.Orders
    ON dbo.OrderProduct.OrderID = dbo.Orders.OrderID
INNER JOIN dbo.Users
    ON dbo.Orders.UserID = dbo.Users.UserID
INNER JOIN dbo.Product_Culture
    ON dbo.OrderProduct.ProductID = dbo.Product_Culture.ProductID 
INNER JOIN dbo.Store_Culture
    ON dbo.Store_Culture.StoreID = dbo.Users.AssignedToStoreID FULL OUTER
JOIN dbo.FileSubmissionDocument
    ON dbo.OrderProduct.OrderProductID = dbo.FileSubmissionDocument.SubOrderProductID - 1
LEFT JOIN (SELECT OP.OrderProductID,
                  OP.DialID,
                  OP.FriendlyValue
           FROM OrderProductDialValue OP
           LEFT JOIN Dial DI ON DI.DialID = OP.DialID
           LEFT JOIN OrderProduct OT ON OT.OrderProductID = OP.OrderProductID
           LEFT JOIN Product PR ON PR.ProductID = OT.ProductID
           WHERE PR.ExternalID = 'BCName'
           AND DI.UProduceDialName = 'Name') OPDV ON OPDV.OrderProductID = dbo.OrderProduct.OrderProductID
WHERE ('@CUSTOMERNAME' is null
        OR '@CUSTOMERNAME' = ''
        OR dbo.Store_Culture.Name LIKE '%' + '@CUSTOMERNAME' + '%')
        AND dbo.OrderProduct.IsDraft = 0
        AND dbo.Orders.IsCart=0
        AND dbo.Orders.IsSaveForLater=0
        AND (('@DATE' <= dbo.Orders.DateOrderCreated)
        OR ('@DATE' IS NULL)
        OR ('@DATE'=''))
        AND ((DATEADD(day, 1, '@DATE') >= dbo.Orders.DateOrderCreated)
        OR ('@DATE' IS NULL)
        OR ('@DATE'=''))
AND dbo.Users.LastName NOT LIKE '%TEST%'
ORDER BY  dbo.Orders.OrderID DESC, dbo.OrderProduct.OrderProductID DESC

查询在在线门户网站上运行报告系统,因此显示为@CUSTOMERNAME或@DATE的值是基于报告运行时给定的值的变量。

2 个答案:

答案 0 :(得分:2)

这可能会对你有所帮助

select orderid,
    productid,
    productvalue,
    case ROW_NUMBER() over (partition by orderid order by orderid)
    when 1 then deliverycharge
    else null end as 'deliverycharge'
     from ........

答案 1 :(得分:0)

我假设您的查询看起来像

    select orderID
         , productID
         , productValue
         , DeliveryCharge
      from test_t
  order by orderID
         , productValue desc
         ;

并且您希望为每个订单中最昂贵的产品列出运费。

如果您的rdbms支持,则可以使用分析RANK函数

    select orderID
         , productID
         , productValue
         , DeliveryCharge
         , CASE RANK() OVER ( PARTITION BY orderID ORDER BY productValue DESC ) WHEN 1 THEN DeliveryCharge ELSE NULL END r
      from test_t
  order by orderID
         , productValue desc
         ;

如果你的rdbms不支持RANK,你可以使用左连接来模拟它,并使用适当聚合的表副本:

    select t.orderID
         , t.productID
         , t.productValue
         , rt.mdc DeliveryCharge
      from test_t t
 left join (
                select orderID
                     , max(productValue)    mp
                     , max(DeliveryCharge)  mdc
                  from test_t
              group by orderID
           ) rt
        on (
                 rt.orderID = t.orderID 
             AND rt.mp      = t.productValue 
           )
  order by orderID
         , productValue desc
         ;

默认的假设是按顺序发送费用(这似乎是合理的,因为你不会选择性地放弃它,对吧?)。

此外,如果该订单包含具有相同productValue的多个产品,则两个解决方案将生成包含每个订单的交付费用的多行。

在oracle 12c1上测试;