具有多个变量的 T-SQL SELECT

Tim*_*Tim 2 sql t-sql sql-server select while-loop

我尝试使用 SQL 语句和 NORTHWIND 数据库获取此输出:

Employee Name:Nancy Davolio
Number of Sales:345
Total Sales:192107.60

Employee Name:Andrew Fuller
Number of Sales:241
Total Sales:166537.75

Employee Name:Janet Leverling
Number of Sales:321
Total Sales:202812.84

Employee Name:Margaret Peacock
Number of Sales:420
Total Sales:232890.85

Employee Name:Steven Buchanan
Number of Sales:117
Total Sales:68792.28
Run Code Online (Sandbox Code Playgroud)

...还有 4 个条目

当我使用这个语句时:

USE Northwind

DECLARE @EmployeeName VARCHAR(40),
        @NumberOfSales INT,
        @TotalSales DECIMAL(10,2),
        @Counter TINYINT = 1,
        @NumEmployees INT = IDENT_CURRENT('dbo.Employees');

WHILE @Counter < @NumEmployees
BEGIN
    --SELECT @EmployeeName = E.FirstName+' '+E.LastName
    --SELECT @NumberOfSales = count(od.OrderID)
    SELECT @TotalSales = SUM(unitprice * quantity * (1 - Discount))
    FROM Employees E
    JOIN Orders AS O ON O.EmployeeID = E.EmployeeID
    JOIN [Order Details] AS OD ON OD.OrderID = O.OrderID
    WHERE E.EmployeeID = @Counter

    PRINT 'Employee Name:       '--+ @EmployeeName;
    PRINT 'Number of Sales:     '--+ LTRIM(STR(@NumberOfSales));
    PRINT 'Total Sales:         '+CONVERT(varchar(10),@TotalSales);
    PRINT '';

    SET @Counter += 1;
END
Run Code Online (Sandbox Code Playgroud)

我可以让每个选择单独工作,但我无法弄清楚使用单个语句SELECT来完成所有工作的语法。我也应该能够用三个SET语句来做到这一点,但我也无法弄清楚。指出这两种可能性的指针会很棒。

这是实际的步骤用语:“在循环中,使用 SELECT 语句检索每个员工的名字和姓氏、每个员工处理的订单数以及每个员工的总销售额(您正在通过以下方式处理每个员工)一)。您需要将多个表连接在一起,并使用聚合函数来获取计数和总计。将连接的全名、销售数量和总销售金额分配给适当的变量。

输出应位于“消息”选项卡中,除了上面列出的预期输出之外,没有其他表格或格式。

Luk*_*zda 5

不需要循环(如果可能,应避免使用RBAR - Row By Agonizing Row方法):

SELECT EmployeeID
       ,[Employee Name] = E.FirstName+' '+E.LastName
       ,[TotalSales] = SUM(unitprice * quantity * (1-Discount))
       ,[NumberOfSales] = COUNT(DISTINCT o.OrderID)
FROM Employees E
JOIN Orders AS O ON O.EmployeeID = E.EmployeeID
JOIN [Order Details] AS OD ON OD.OrderID = O.OrderID
GROUP BY E.EmployeeID, E.FirstName+' '+E.LastName
ORDER BY E.EmployeeID;
Run Code Online (Sandbox Code Playgroud)

编辑:

循环版本 - 一次分配多个变量。

USE Northwind

DECLARE @EmployeeName VARCHAR(40),
        @NumberOfSales INT,
        @TotalSales DECIMAL(10,2),
        @Counter TINYINT = 1,
        @NumEmployees INT = IDENT_CURRENT('dbo.Employees');

WHILE @Counter < @NumEmployees
BEGIN
    SELECT @EmployeeName  = E.FirstName+' '+E.LastName
          ,@NumberOfSales = COUNT(DISTINCT o.OrderID)
          ,@TotalSales    = SUM(unitprice * quantity * (1 - Discount))
    FROM Employees E
    JOIN Orders AS O ON O.EmployeeID = E.EmployeeID
    JOIN [Order Details] AS OD ON OD.OrderID = O.OrderID
    WHERE E.EmployeeID = @Counter
    GROUP BY E.FirstName+' '+E.LastName;

    PRINT 'Employee Name:       '+ @EmployeeName;
    PRINT 'Number of Sales:     '+ LTRIM(STR(@NumberOfSales));
    PRINT 'Total Sales:         '+ CONVERT(varchar(10),@TotalSales);
    PRINT '';

    SET @Counter += 1;
END
Run Code Online (Sandbox Code Playgroud)

请注意,WHILE当你有间隙时,使用循环可能非常低效(即你从 1 开始到IDENT_CURRENT,这可能是你有像 1,5, 200671 这样的 id 的情况,并且最终会出现不必要的循环)。


编辑2:

当 select 中发生多个分配时,似乎需要 GROUP BY

我添加是GROUP BY因为 FirstName 和 LastName 没有用聚合函数包装。您可以跳过该子句,但随后您需要添加MIN/MAX函数:

SELECT @EmployeeName  = MIN(E.FirstName)+' '+MIN(E.LastName)
      ,@NumberOfSales = COUNT(DISTINCT o.OrderID)
      ,@TotalSales    = SUM(unitprice * quantity * (1 - Discount))
FROM Employees E
JOIN Orders AS O ON O.EmployeeID = E.EmployeeID
JOIN [Order Details] AS OD ON OD.OrderID = O.OrderID
WHERE E.EmployeeID = @Counter;
-- and we are sure that all values for First/Last nane are the same because of  
-- WHERE E.EmployeeID = @Counter
Run Code Online (Sandbox Code Playgroud)

相关:Group by 子句

在标准 SQL 中,包含 GROUP BY 子句的查询无法引用选择列表中未在 GROUP BY 子句中命名的非聚合列