2016-06-15 70 views
1

营销部门希望首先关注Noth America的客户。获取所有客户的ID,姓氏和国家。首先培养居住在加拿大和美国的顾客,最后通过身份证订购。 提示:在ORDER BY子句中使用IN表达式。ORDER BY + IN声明?

我试过很多次

SELECT CustomerID, LastName, Country 
FROM Customer 
ORDER BY Country IN ('Canada', 'USA'), CustomerID 

,但它似乎没有工作,因为它需要来自所有客户的指定字段中,也出现在原始表(顺序按ID排序),即使我从ORDER BY条款中删除CustomerID,但不关心它们属于哪个国家/地区。

我该怎么办?我对SQL很陌生,不知道如何解决这个问题。

编辑:WHERE不适合所有,因为我需要考虑所有客户,只有确保加拿大和美国的出现在列表的顶部。 此外,我不确定的陈述如UNION,AS,EXCEPT和类似的东西是为了使用,因为教程没有那么深。

+1

当问SQL问题,始终标记使用的DBMS。 SQL方言不同,在一个DBMS中可能需要另一个解决方案。 –

+0

@Thorsten Kettner这只是一般的SQL – user6245072

回答

5

不是每个DBMS都有一个布尔数据类型。所以结果如下

Country IN ('Canada', 'USA'), 

这是一个布尔值,不能在这些DBMS中排序。

可以使用CASE表达,但是,分配一个值:

SELECT CustomerID, LastName, Country 
FROM Customer 
ORDER BY CASE WHEN Country IN ('Canada', 'USA') THEN 1 ELSE 2 END, CustomerID; 
+0

这实际上产生了预期的结果。谢谢! – user6245072

-1

在表达不返回值,所以你不能排序

你可以试试:

SELECT CustomerID, LastName, Country 
FROM Customer 
WHERE Country='Canada' 

UNION ALL 

SELECT CustomerID, LastName, Country 
FROM Customer 
WHERE Country='USA' 
ORDER BY CustomerID 

使用ORDER BY与UNION,EXCEPT和INTERSECT当一个查询使用UNION,EXCEPT或INTERSECT运算符时,ORDER BY子句必须在语句结尾处指定 ,并且对合并的 查询的结果进行排序。以下示例返回 为红色或黄色的所有产品,并按列 ListPrice对此组合列表进行排序。 https://msdn.microsoft.com/en-us/library/ms188385.aspx#Union

+0

这会产生一个语法错误 – user6245072

+0

你会收到什么语法错误? – ThiepLV

+0

查询看起来正确,不应该产生任何错误。但是,结果仅按CustomerID排序,这是不期望的。 WHERE条款将结果限制在美国和加拿大,这也是不希望的。只有'Country IN'('USA','Canada')也可以得到同样的结果。改用'UNION ALL'是没有意义的。 –