Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个变量的T-SQL SELECT_Sql_Sql Server_Tsql_Select_While Loop - Fatal编程技术网

具有多个变量的T-SQL SELECT

具有多个变量的T-SQL SELECT,sql,sql-server,tsql,select,while-loop,Sql,Sql Server,Tsql,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 Emp

我正在尝试使用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
…还有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
使用北风
声明@EmployeeName VARCHAR(40),
@NumberOfInt,
@总销售额小数(10,2),
@计数器TINYINT=1,
@NumEmployees INT=IDENT_CURRENT('dbo.Employees');
而@Counter<@numemememployees
开始
--选择@EmployeeName=E.FirstName+“”+E.LastName
--选择@NumberOfSales=count(od.OrderID)
选择@TotalSales=SUM(单价*数量*(1-折扣))
来自雇员
在O.EmployeeID=E.EmployeeID上以O的形式加入订单
以OD.OrderID=O.OrderID上的OD加入[Order Details]
其中E.EmployeeID=@Counter
打印“员工姓名:”--+@EmployeeName;
打印“销售数量:”--+LTRIM(STR(@NumberOfSales));
打印“总销售额:”+转换(varchar(10),@TotalSales);
打印“”;
设置@Counter+=1;
结束
我可以让每个select单独工作,但我无法找出语法来获得一个
select
语句来完成所有工作。我也应该能够用三个
SET
语句来实现这一点,但我也没有弄明白这一点。指向这两种可能性的指针将非常棒

下面是实际步骤的措辞: “在循环中,使用SELECT语句检索每个员工的名字和姓氏、每个员工处理的订单数量以及每个员工的总销售额(您正在逐个处理每个员工)。您需要将多个表联接在一起,并使用聚合函数获取计数和总数。请将串联的全名、销售额和总销售额分配给相应的变量。“


输出应在消息选项卡中,除上面列出的预期输出外,没有其他表格或格式。

不需要循环(如果可能,应避免使用这种方法):

编辑:

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

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
相关的:

在标准SQL中,包含GROUP BY子句的查询不能引用select列表中未在GROUP BY子句中命名的未聚合列


这应该可以做到。我使用CROSS APPLY取消打印集合,然后对其进行相应的格式化。您可以在一篇名为“交叉应用另一种方法取消PIVOT”的文章中了解更多信息。因为SQL是与集合一起工作的,所以在我看来,SQL的输入和输出应该始终是一个集合

恐怕您的格式化方式可能不是SQL的工作,但仍然可以使用“单个”select语句作为集合操作:

;WITH CTE AS 
(
SELECT 
        EMPLOYEENAME =    E.FirstName +' '+ E.LastName,  
        NUMBEROFORDERS =  COUNT(OD.OrderID),
        TOTALSALES =      SUM(unitprice * quantity * (1-Discount))

   FROM Employees E
   INNER JOIN Orders AS O ON O.EmployeeID = E.EmployeeID
   INNER JOIN [Order Details] AS OD ON OD.OrderID = O.OrderID
   GROUP BY E.FirstName + ' ' + E.LastName
)


SELECT COLNAME, ColValue
FROM CTE

CROSS APPLY ( VALUES ('Employe Name:', EMPLOYEENAME),
                     ('Number of Sales:', LTRIM(STR(NUMBEROFORDERS, 25, 5)) ),
                     ('Total Sales:', LTRIM(STR(TOTALSALES, 25, 5)) ),
                     ('','')

            ) A  (COLNAME, ColValue)
示例输出如下:

COLNAME             ColValue
-------------   | ------------- 
Employe Name:   | Nancy Davolio
Number of Sales:|  345.00000
Total Sales:    |  192107.60432

因为,把我送上飞机,我们都会死。教我爬、走、跑、跳,。。。那我就可以飞了。虽然我基本上可以(因为我不完全理解你的陈述,尽管我想学习)欣赏你的代码的简洁性,但我仍然需要学习这些完整的令人痛苦的知识。@TimGibney如果你真的必须使用
循环
,那么你可以立即分配多个变量。是的,完美@Lukasz Szozda!非常感谢。在select?@TimGibney中进行多个赋值时,似乎需要GROUP BY。我已经对此进行了澄清part@TimGibney另一个选项是游标循环,但我假设它现在不在您练习的范围内,所以我列出的预期输出是从一个正式的“学习SQL”课程开始的,这是我得到的第二手资料。该工作手册说明了明确的说明,但提供了除预期输出之外的非常少的“答案”。所以严格地说,列出的输出与预期不符。另外,严格地说,交叉应用不在本节中,也不在“CTE”中,不管它是什么。好吧,这很有趣,如果你碰巧发现了它或偶然发现了一个解决方案,请将它发布在这里。我只是好奇:)“输出应该在消息选项卡中”意味着使用
Print
RaIsError
Throw
输出数据。抱歉,查询结果无法重定向到“消息”选项卡。您可以编写一个查询,例如,像用于构造逗号分隔列表的查询一样,生成包含所有数据(包括换行符)的单个字符串,然后打印该结果。这不是通常编写应用程序的方式。
;WITH CTE AS 
(
SELECT 
        EMPLOYEENAME =    E.FirstName +' '+ E.LastName,  
        NUMBEROFORDERS =  COUNT(OD.OrderID),
        TOTALSALES =      SUM(unitprice * quantity * (1-Discount))

   FROM Employees E
   INNER JOIN Orders AS O ON O.EmployeeID = E.EmployeeID
   INNER JOIN [Order Details] AS OD ON OD.OrderID = O.OrderID
   GROUP BY E.FirstName + ' ' + E.LastName
)


SELECT COLNAME, ColValue
FROM CTE

CROSS APPLY ( VALUES ('Employe Name:', EMPLOYEENAME),
                     ('Number of Sales:', LTRIM(STR(NUMBEROFORDERS, 25, 5)) ),
                     ('Total Sales:', LTRIM(STR(TOTALSALES, 25, 5)) ),
                     ('','')

            ) A  (COLNAME, ColValue)
COLNAME             ColValue
-------------   | ------------- 
Employe Name:   | Nancy Davolio
Number of Sales:|  345.00000
Total Sales:    |  192107.60432