SQL:如何仅对多列中的一列应用distinct?

时间:2017-07-26 08:51:28

标签: sql distinct

我有两张表CustomersOrdersOrderID包含以下列:CustomerIDCustomersCustomerID包含列:CustomerNameCustomers。我有一些来自SELECT DISTINCT(CustomerName) OrderID, Orders.CustomerID, CustomerName FROM Customers LEFT JOIN Orders ON Orders.CustomerID = Customers.CustomerID ORDER BY CustomerName; 但没有任何订单的记录。所以我希望得到所有独特的客户(即使他们没有订单)和订单。

我想通过使用此查询来获取它:

OrderID

但它会将CustomerName列值替换为SELECT OrderID, CustomerID, CustomerName FROM ( SELECT DISTINCT(CustomerName) OrderID, Orders.CustomerID, CustomerName FROM Customers LEFT JOIN Orders ON Orders.CustomerID = Customers.CustomerID ORDER BY CustomerName ); 个值。 这就是为什么我应该使用以下查询来获得所需的结果。

sudo apt-get install libc6

我的第一个查询是否有任何错误?有可能解决它吗?

3 个答案:

答案 0 :(得分:3)

当客户有多个订单时,

Convert.ToInt32(_idlicense.Value) 将返回多条记录 OrderID适用于整个记录,而不是单个字段,因此如果客户有多个订单,它将显示两条记录 - 客户将是相同的,但订单ID不同,因此两个记录都将与众不同。

如果您DISTINCT订单ID和COUNT Group您将获得独特的客户以及他们已完成的订单数量:

CustomerName

enter image description here

答案 1 :(得分:0)

使用它:

    SELECT DISTINCT(CustomerName) as CusName, OrderID, Orders.CustomerID
    FROM Customers LEFT JOIN Orders ON Orders.CustomerID = 
    Customers.CustomerID ORDER BY CusName;

您正在使用客户名称两次,实际上OrderId在您的情况下是别名列名称CustomerName:)

答案 2 :(得分:0)

首先,您必须明白,如果您想要OrderId col,则意味着如果每个客户有多个订单 - 它将复制行。 所以你必须选择:或每个客户的不同行或显示订单你不能同时拥有它们! (这是一个逻辑问题而不是SQL错误) 无论如何你必须使用LEFT OUTER JOIN才能看到没有订单的客户。

一个选项是计算订单:

SELECT C.CustomerName, COUNT(0) AS NumOfOrders
FROM Customers C
LEFT OUTER JOIN Orders O ON O.CustomerID = C.CustomerID
GROUP BY C.CustomerName
ORDER BY C.CustomerName;

另一种选择是允许重复:

SELECT C.CustomerName, O.OrderID
FROM Customers C
LEFT OUTER JOIN Orders O ON O.CustomerID = C.CustomerID
ORDER BY C.CustomerName;