使用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 {?}
答案 0 :(得分:3)
试试这个:
SELECT *
FROM CustomerOrder
ORDER BY COUNT(CASE WHEN Order_Type = 'S' THEN 1 END) OVER (PARTITION BY Customer) DESC,
Customer
我假设你基本上想要订购你的数据,放在拥有至少一个'S'的顶级客户群上。
修改:您必须添加:
CASE WHEN Order_Type = 'S' THEN 0 ELSE 1 END
在ORDER BY
子句的尾部,如果您希望始终将'S'
条记录放在其组的第一位。
答案 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