簡體   English   中英

如何基於SQL Server的另一列中的最高價值為每個客戶獲得一行

[英]How to get a single row for each customer based on highest value in another column in SQL Server

我有一個包含一些客戶信息的表:

--------------------------------------------
|CustID  CustType  OrderType  CountofOrders|
|------------------------------------------|
|  1        C         DD          23       |
|  2       IC         DE          10       |
|  2       IC         DR           7       |
|  2       IC         DS           7       |
|  3        C         DR          14       |
|  3        C         DS          19       |
|  4       IC         DS           5       |
|  4       IC         DR           5       |
|  4       IC         DE           3       |
|  5       IC         DR           7       |
|  5       IC         DS           7       |
|  5       IC         DE           7       |
--------------------------------------------

當CustType不是'IC'時,我想為客戶拉出所有記錄,無論他們有多少行。

因此,例如,CustID 1將返回1行,而CustID 3將返回2行。 當CustType為'IC'時,我只想根據最高CountofOrders為該客戶拉一行。

因此,對於CustID 2,它應提取OrderType為'DE'且CountofOrders為10的記錄。

如果“ IC”客戶對各種OrderType的計數相同,那么我想獲得OrderType為“ DE”的行。 如果OrderType不是'DE',那么我想獲得OrderType為'DS'的行。 簡而言之,應優先考慮OrderType'DE',然后是'DS','DR'和'DD'

所以我的最終輸出應如下所示:

-------------------------------------------
|CustID  CustType  OrderType  CountofOrders|
-------------------------------------------|
|  1        C         DD           23      |
|  2       IC         DE           10      |
|  3        C         DR           14      |
|  3        C         DS           19      |
|  4       IC         DS            5      |
|  5       IC         DE            7      |
--------------------------------------------

當CountofOrders不相同時,我可以使用以下查詢獲得最高的價格,但是當CountofOrders在不同OrderTypes之間相同時,我很難解決如何基於OrderType獲取行。 。

SELECT 
    a.CustID, a.CustType, a.OrderType, a.CountofOrders
FROM 
    CustInfo a 
WHERE 
    a.CountofOrders = (SELECT MAX(CountofOrders) 
                       FROM CustInfo b 
                       WHERE a.CustID = b.CustID)

任何幫助將不勝感激。 謝謝。

您可以使用ROW_NUMBER輕松完成此操作。 這將返回樣本數據中您想要的結果。

DECLARE @Customer table
(
    CustID int
    , CustType varchar(10)
    , OrderType char(2)
    , CountofOrders int
)

INSERT @Customer
(
    CustID
    , CustType
    , OrderType
    , CountofOrders
)
VALUES
(1, 'C', 'DD', 23)
, (2, 'IC', 'DE', 10)
, (2, 'IC', 'DR', 7)
, (2, 'IC', 'DS', 7)
, (3, 'C', 'DR', 14)
, (3, 'C', 'DS', 19)
, (4, 'IC', 'DS', 5)
, (4, 'IC', 'DR', 5)
, (4, 'IC', 'DE', 3)
, (5, 'IC', 'DR', 7)
, (5, 'IC', 'DS', 7)
, (5, 'IC', 'DE', 7)

SELECT x.CustID
    , x.CustType
    , x.OrderType
    , x.CountofOrders
FROM
(
    SELECT *
         , ROW_NUMBER() over(partition by CustID order by CountOfOrders desc
            , case OrderType 
                when 'DE' then 1
                when 'DS' then 2
                when 'DR' then 3
                when 'DD' then 4
                else 5
            end) as RowNum
    FROM @Customer
) x
WHERE x.CustType <> 'IC'
    OR x.RowNum = 1
ORDER BY CustID
    , CountofOrders

我認為您的要求無法在查詢級別完成,因為該順序基於優先級。 我的意思是您必須使用存儲過程之類的東西或在應用程序中執行訂購過程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM