2017-03-29 2 views
0

私は達成しようとしていることを正確に説明するのが難しいと思っています。SQL - 重複したレコードの最初のインスタンスの1列の結果のみを表示

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として示した値は、一度に与えられた値に基づいて変数ですので、クエリはオンラインポータル上の報告システムを通りますレポートが実行されたとき。

+0

あなたを助けるかもしれませんか? –

+0

あなたのコードを追加することができます –

+0

返品するかどうかをどのように配達料を知るには? – jarlh

答えて

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 ........ 
+0

これは、確かに、私の問題を解決した、ありがとうございます!どうやって実際に何をしているのか説明してください。ありがとう – MattJA

0

私はあなたのクエリが

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

のように見え、あなたが各オーダーの最も高価な製品に記載された配送料を望んでいることを前提としています。

あなたのRDBMSでサポートされている場合は、あなたのRDBMSがRANKをサポートしていない場合、あなたは分析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 
     ; 

を使用することができ、あなたは左を使用して、それをエミュレートすることができ、あなたのテーブルの適切な集約コピーに参加する:

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 
     ; 

配送料はオーダーであることを前提としています(そうでなければ、それを選択的に削除したくないと思われます)。

また、両方のソリューションでは、同じorderValueを持つ複数の商品が含まれている場合、1注文あたりの配送料を含む複数の行が生成されます。

oracle 12c1でテスト済み。

+0

こんにちは、この応答ありがとうございます。残念ながら、同じ単価を持つ複数の製品があるため、私にはうまくいかないでしょう。このランク機能を実装した後は、一部の場合は機能しますが、複数の商品に割り当てられた配送料が依然として多くあります。これに取り組む他の方法はありますか? – MattJA

+0

@MattJAあなたはすでに適切な解決策を受け入れています。要点は私の提案と同じですが、 'productValue'に基づいてランクを計算するのではなく、各パーティションのレコードを数えるだけです。 – collapsar

関連する問題