繁体   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