具有多个变量的T-SQL SELECT
我正在尝试使用SQL语句和NORTHWIND数据库获取此输出:具有多个变量的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
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