通过具有一定价值的订单

时间:2015-03-18 15:15:17

标签: sql sql-server-2008

使用Microsoft SQL Server 2008

需要针对以下方案的选择查询
Order Customer Order_Type
1     A        NULL
2     A        NULL
3     B        S
4     C        NULL
5     D        S
6     B        NULL

我想要已经下订单类型S的集团客户,所以我期望的输出是

Order Customer Order_Type
3     B        S
6     B        NULL
5     D        S
1     A        NULL
2     A        NULL
4     C        NULL

SELECT Order, Customer, Order_Type FROM CustomerOrder GROUP BY Customer,Order, Order_Type HAVING {?}

5 个答案:

答案 0 :(得分:3)

试试这个:

SELECT *
FROM CustomerOrder      
ORDER BY COUNT(CASE WHEN Order_Type = 'S' THEN 1 END) OVER (PARTITION BY Customer) DESC, 
         Customer

我假设你基本上想要订购你的数据,放在拥有至少一个'S'的顶级客户群上。

SQL Fiddle Demo

修改:您必须添加:

CASE WHEN Order_Type = 'S' THEN 0 ELSE 1 END

ORDER BY子句的尾部,如果您希望始终将'S'条记录放在其组的第一位。

SQL Fiddle Demo

答案 1 :(得分:1)

GROUP BY用于根据公共列值将多行分组到一行中。

例如,您可能会计算出特定客户的订单数量如下:

SELECT Customer, COUNT(*) FROM Table
GROUP BY Customer

这将使您输出列出客户名称和他们拥有的订单行数。

如果您想限制此项(例如WHERE子句),请使用HAVING

SELECT Customer, COUNT(*) FROM Table
GROUP BY Customer
HAVING Count(*) > 1

这将为您提供超过1个订单的所有客户。

如果要整理输出,可以使用ORDER BY进行排序。

SELECT * FROM Table
ORDER BY Order_Type

您甚至可以使用多列进行排序。它将首先根据第一列进行排序,然后它将按第二列对这些组(第一列全部匹配的行)进行排序,依此类推。

SELECT * FROM Table
ORDER BY Order_Type, Customer

编辑:

通过其他答案,我很清楚你真正在问什么。我将按原样留下我的答案,因为GROUP和ORDER的基本解释可能对将来可能会发现此问题的人有用。

正如其他人所说,如果您希望整理您的表格以使所有符合条件X的行(在本例中为'Order_Type = S')的客户,您无法通过简单查询或一个HAVING条款。正如所指出的,有很多方法可以做到这一点。

答案 2 :(得分:1)

您要找的是ORDER BY,而不是GROUP BY

试试这个:

SELECT
t.[Order],
t.Customer,
t.Order_Type
FROM
t
LEFT JOIN (SELECT Customer FROM t WHERE Order_Type = 'S') s
ON t.Customer = s.Customer
ORDER BY
s.Customer DESC

我们在这里做的只是添加信息,如果每个客户都有order_type S的订单。使用LEFT JOIN此客户编号是客户编号(如果有)或NULL。所以我们命令DESC结束,然后按照你想要的任何方式。

答案 3 :(得分:0)

这似乎产生了您正在寻找的结果:

declare @t table ([Order] int,Customer char(1),Order_Type char(1))
insert into @t([Order],Customer,Order_Type) values
(1,'A',NULL),
(2,'A',NULL),
(3,'B','S' ),
(4,'C',NULL),
(5,'D','S' ),
(6,'B',NULL)

;With TypeS as (
    select *, --TODO - Column list
     MAX(CASE WHEN Order_Type = 'S' THEN 1 ELSE 0 END)
     OVER (PARTITION BY Customer) as SeenS
    from @t
)
select * --TODO - Explicit column list if SeenS shouldn't appear
from TypeS ORDER BY SeenS desc,Customer,[Order]

我们使用窗口函数MAX(...) OVER (PARTITION BY ...),以便在每一行中计算出该客户的任何行是否具有S订单类型。

结果:

Order       Customer Order_Type SeenS
----------- -------- ---------- -----------
3           B        S          1
6           B        NULL       1
5           D        S          1
1           A        NULL       0
2           A        NULL       0
4           C        NULL       0

答案 4 :(得分:0)

您也可以使用临时表:

DROP TEMPORARY TABLE IF EXISTS tmp_1;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_1 AS (
SELECT
   *
FROM CustomerOrder
WHERE Order_Type is not null
ORDER BY Order_Type DESC
);

SELECT t1.* FROM CustomerOrder t1
LEFT JOIN tmp_1 t2 ON t2.Customer = t1.Customer