繁体   English   中英

SQL查询以查找内容差异最大的ID

[英]SQL Query to find the ID with highest difference of contents

我是SQL(服务器)的新手,以下问题确实使我毫无头绪。

ID  Order Type    
=====================    
26  Automatic Orders    
26  Backend Orders    
41  Automatic Orders    
58  Automatic Orders    
86  Automatic Orders    
86  Automatic Orders    
86  Automatic Orders    
111 Automatic Orders    
104 Automatic Orders    
112 Backend Orders    
112 Backend Orders    
119 Backend Orders    
119 Backend Orders    
119 Backend Orders

现在,要求查找“自动订单数量较多且后端订单较少的酒店?”

尽管我能够回答随之而来的大多数问题,但我真的不知道该怎么做才能破解!

如果我正确理解了您的问题,则您希望Automatic Orders酒店数量多于Backend Orders 您可以为此使用SUMHAVING功能。

SELECT
    ID
FROM temp
GROUP BY ID
HAVING
    SUM(CASE WHEN [Order Type] = 'Automatic Orders' THEN 1 ELSE 0 END) > 
    SUM(CASE WHEN [Order Type] = 'Backend Orders' THEN 1 ELSE 0 END)

编辑

根据您对Asketh答案的评论,这很可能满足您的需求:

SELECT
    TOP 1 *
FROM(
    SELECT
        ID,
        [Automatic Orders] = SUM(CASE WHEN [Order Type] = 'Automatic Orders' THEN 1 ELSE 0 END),
        [Backend Orders] = SUM(CASE WHEN [Order Type] = 'Backend Orders' THEN 1 ELSE 0 END)
    FROM temp
    GROUP BY ID
)t
ORDER BY ([Automatic Orders] - [Backend Orders]) DESC

不确定这正是您所需要的,但是它可以引导您找到解决方案。

如果我理解正确,您是否希望自动和后端订单之间的差异最大的酒店?

如果是这样,这可能会有所帮助。

假设存在该表,并使用您提供的值填充该表:

CREATE TABLE [dbo].[Orders](
    [Id] [int] NULL,
    [Type] [varchar](50) NULL
) ON [PRIMARY]

该查询应返回根据需求排序的酒店列表。

SELECT  a.HotelId , a.NumOfAutomaticOrders - a.NumOfBackendOrders
FROM    
(
    SELECT  Id as HotelId , 
    sum(case when [type] = 'Automatic Orders' then 1 else 0 end ) NumOfAutomaticOrders,
    sum(case when [type] = 'Backend Orders' then 1 else 0 end ) NumOfBackendOrders
    FROM Orders
    where 1=1
    group by Id 
) a
order by 2 desc
SELECT 
    ID, 
    a.cnt,  
    b.cnt 
FROM (
    SELECT 
        id, COUNT(ordertype) cnt 
    FROM tab
    WHERE ordertype = 'Automatic Order' 
    GROUP BY id
) a
JOIN (
    SELECT 
        id, COUNT(ordertype) cnt 
    FROM tab
    WHERE ordertype = 'Backend Order' 
    GROUP BY id
) b
ON a.id = b.id 
WHERE a.cnt> b.cnt

编辑 :如果您想要与众不同的酒店,请执行以下操作:

SELECT TOP 1 
    ID, 
    a.cnt,  
    b.cnt 
FROM (
    SELECT 
        id, COUNT(ordertype) cnt 
    FROM tab
    WHERE ordertype = 'Automatic Order' 
    GROUP BY id
) a
JOIN (
    SELECT 
        id, COUNT(ordertype) cnt 
    FROM tab
    WHERE ordertype = 'Backend Order' 
    GROUP BY id
) b
ON a.id = b.id 
WHERE a.cnt> b.cnt

订购(a.cnt-b.cnt)

我理解您的问题如下:首先找到自动订单数量最多的酒店,其中首先找到后端订单最少的酒店。 如果为真,则此查询有效

DECLARE @t TABLE (ID INT, Type NVARCHAR(MAX))

INSERT INTO @t VALUES(26, 'Automatic Orders')
INSERT INTO @t VALUES(26, 'Backend Orders')
INSERT INTO @t VALUES(41, 'Automatic Orders')
INSERT INTO @t VALUES(58, 'Automatic Orders')
INSERT INTO @t VALUES(86, 'Automatic Orders')
INSERT INTO @t VALUES(86, 'Automatic Orders')
INSERT INTO @t VALUES(86, 'Automatic Orders')
INSERT INTO @t VALUES(111, 'Automatic Orders')
INSERT INTO @t VALUES(104, 'Automatic Orders')
INSERT INTO @t VALUES(104, 'Automatic Orders')
INSERT INTO @t VALUES(104, 'Automatic Orders')
INSERT INTO @t VALUES(112, 'Backend Orders')
INSERT INTO @t VALUES(112, 'Backend Orders')
INSERT INTO @t VALUES(119, 'Backend Orders')
INSERT INTO @t VALUES(119, 'Backend Orders')
INSERT INTO @t VALUES(119, 'Backend Orders');



WITH cte AS
(
SELECT ao.ID, ao.Count AS AutomaticOrdersCount, ISNULL(bo.Count, 0) AS BackendOrdersCount FROM 
(
SELECT ID, Type, COUNT(*) AS Count FROM @t
WHERE Type = 'Automatic Orders'
GROUP BY ID, Type
)ao
LEFT JOIN 
(
SELECT ID, Type, COUNT(*) AS Count FROM @t
WHERE Type = 'Backend Orders'
GROUP BY ID, Type
)bo ON bo.ID = ao.ID
ORDER BY ao.Count DESC, ISNULL(bo.Count, 0) ASC
)
SELECT * FROM cte 
WHERE AutomaticOrdersCount = (SELECT MAX(AutomaticOrdersCount) FROM cte) AND 
        cte.BackendOrdersCount = (SELECT TOP 1 BackendOrdersCount FROM cte)
ORDER BY cte.ID

感谢你们每个人都试图帮助我。 通过您提出的查询,我得到了很多建议。 正如@YS所说,我还认为找到自动订单和后端订单之间差异最大的酒店将解开难题。 我写了这样一个简单的代码,它将返回差异最大的酒店。

SELECT TOP 1 id, SUM(IIF(Order_Type='Automatic orders',1,-1)) AS Score
FROM P1
GROUP BY id
ORDER BY score DESC

这给了我答案,但是我怀疑这是我应该写的正确查询。 在我的答案中,我将获得'分数(计算结果)和相应的酒店ID。

Score  id
-----  ----
xx     xxx

如何避免顺便显示最终结果中的“分数”?!?

我只想在最终结果中显示唯一的酒店ID。 由于计算/条件在SELECT ,因此我也可以保留SUM(IIF(Order_Type='Automatic orders',1,-1))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM