-1
SELECT DISTINCT 
    E.FirstName + ' ' + E.LastName [Full Name], 
    P.ProductName, 
    OD.Quantity
FROM    Employees E, 
        Products P, 
        [Order Details] OD, 
        Orders O
WHERE 
    E.EmployeeID = O.EmployeeID
    AND O.OrderID = OD.OrderID
    AND OD.ProductID = P.ProductID

在 Northwind 返还副本FullNames,并且ProductNames由于Quantity更改了(因为每次发货的日期)。

我只想向ProductName具有总数量的特定对象提供一个名称,而不是划分。

4

2 回答 2

2

您需要GROUP BY使用SUM

SELECT
    e.FirstName + ' ' + e.LastName AS [Full Name], 
    p.ProductName, 
    SUM(od.Quantity) AS [Quantity]
FROM Employees e
INNER JOIN Orders o
    ON o.EmployeeID = e.EmployeeID
INNER JOIN [Order Details] od
    ON od.OrderID = o.OrderID
INNER JOIN Products p
    ON p.ProductID = od.ProductID
GROUP BY
    e.FirstName + ' ' + e.LastName,
    p.ProductName

请注意,您需要停止使用旧式JOIN语法。

于 2016-04-25T01:31:17.223 回答
0

我认为,这是一个很好的讨论问题。

正确查询始终取决于您的实际需求。

我认为你的表太正常化了。在这种情况下,他们中的大多数也会将 Employeeid 保留在 order_detail 表中。

同时,它们中的大多数都在 Order 表中保留 sum 值。就像订单表中每个订单的数量总和,金额总和等。

您还可以创建视图而无需聚合函数加入所有表。

恕我直言,在这么多列上使用 Group By 子句,而在 varchar 列上也使用 Group By 子句是个坏主意。

试试这样的,

;With CTE as
(
 SELECT 
    E.FirstName + ' ' + E.LastName [Full Name], 
     O.OrderID,od.qty,P.ProductName
FROM  Employees E
inner join  Orders O on  E.EmployeeID = O.EmployeeID
inner join [Order Details] OD on o.orderid=od.orderid      
inner join [Products] P on p.ProductID=od.ProductID 
)
,CTE1 as
(
select od.orderid, sum(qty) TotalQty 
from CTE c
group by c.orderid

)

select c.[Full Name],c1.TotalQty, P.ProductName from cte c
inner join cte1 c1 on c.orderid=c1.orderid
于 2016-04-26T04:24:37.887 回答