【问题标题】:LOOP and COUNT in a SELECT statement SQL SERVERSELECT 语句中的 LOOP 和 COUNT SQL SERVER
【发布时间】:2017-03-11 09:03:59
【问题描述】:

我对这些列有一个看法

我想提取这些数据

我在 SQL Server 中通过几个步骤手动执行此操作,并且我想将其自动化,以便我可以直接从宏运行 select 语句并将其保存在 excel 文件中。 这就是我正在做的事情

select distinct 
CASE 
WHEN Userid ='jsolar' THEN 'Jack Solar'
WHEN Userid ='jkrcmarikova' THEN 'Jana Krcmarikova'
WHEN Userid ='lfialova' THEN 'lucia fialova'
WHEN Userid ='zsnopkova' THEN 'zuzana snopkova'
END AS [User Name]
, Region
from [SC].[vw_X86_Orders_By_UserID_GAMMA]
order by Region, [User Name]

然后我将结果复制到 excel 文件中并为每个用户运行其他查询

SELECT Count ( DISTINCT [Order Number]) 
FROM [SC].[vw_X86_Orders_By_UserID_GAMMA]
where Userid LIKE 'jsolar'
AND Region LIKE 'CENTRAL'
and [Order Entry Date] = '2016-10-27'

我将此结果保存为不同订单号的数量。然后我运行这个查询

SELECT Count ( DISTINCT CONCAT ([Order Number], [Line No])) 
FROM [SC].[vw_X86_Orders_By_UserID_GAMMA]
where Userid LIKE 'jsolar'
AND Region LIKE 'CENTRAL'
and [Order Entry Date] = '2016-10-27'

我将此结果保存为与行号连接的不同订单号的数量。我对每个用户重复同样的操作

最后在 Excel 中应该是这样的

有没有办法在一个 select 语句中执行此操作以循环每个用户并同时计算所有用户?非常感谢。

【问题讨论】:

  • 您想要地区、用户ID、订单号计数、订单号计数和行号?
  • 我想是的......你的用户名存储在哪里?
  • @esquire 是的,对于每个用户和每个地区,我都会计算有多少不同的 orderNumber 和有多少不同的 concat(orderNumber, lineNumber)
  • @xQbert,名称我没有存储在视图中,我只是在纸上。
  • 如果可能,您应该考虑将名称保存在单独的表中。

标签: sql sql-server tsql


【解决方案1】:

我真的认为您不需要“循环”。 SQL 在返回具有许多行的记录集的基于集合的操作中运行得最好。所以我们需要将 [SC].[vw_X86_Orders_By_UserID_GAMMA] 视为一个完整的集合,并简单地更新 case 语句以翻译所有用户名(假设您必须拥有它们,或者您可以在 Excel 中的用户 ID 上执行 vlookup 之后事实)

我认为您真正追求的是 count(distinct column)group by on userID and region 的组合。

基于 cmets,我认为您需要修改 select 和 group by 中的 case 语句以包含所有用户的翻译。

我认为有太多的未知数无法提供 100% 正确的响应,但这里有一个射门..

SELECT CASE WHEN Userid ='jsolar' THEN 'Jack Solar'
            WHEN Userid ='jkrcmarikova' THEN 'Jana Krcmarikova'
            WHEN Userid ='******' THEN '**** *******'
            WHEN Userid ='****' THEN '***** ****' END AS [User Name]
, Region
, count(distinct [Order Number]) as cntDistinctOrders
, count(Distinct concat([order Number], [Line No]) as cntDistinctOrderLines

FROM [SC].[vw_X86_Orders_By_UserID_GAMMA]

WHERE [Order Entry Date] = '2016-10-27'
 -- and Region = 'CENTRAL'  don't think you need this the group by handles same names in different regions keeping them distinct and counts seperate.

GROUP BY CASE WHEN Userid ='jsolar' THEN 'Jack Solar'
              WHEN Userid ='jkrcmarikova' THEN 'Jana Krcmarikova'
              WHEN Userid ='******' THEN '**** *******'
              WHEN Userid ='****' THEN '***** ****'
              END
, Region

ORDER BY [User Name], Region

用简单的英语说...

您希望 [SC].[vw_X86_Orders_By_UserID_GAMMA] 架构表中的每个用户的所有用户名和区域显示特定日期的订单和订单行的不同计数。

如果您可以在 excel 中使用 Vlookup 来获取您可以在没有 case 语句和所有额外代码的情况下逃脱的名称..

 SELECT UserId [User Name]
    , Region
    , count(distinct [Order Number]) as cntDistinctOrders
    , count(Distinct concat([order Number], [Line No]) as cntDistinctOrderLines
FROM [SC].[vw_X86_Orders_By_UserID_GAMMA]

WHERE [Order Entry Date] = '2016-10-27'
 -- and Region = 'CENTRAL'  don't think you need this the group by handles same names in different regions keeping them distinct and counts seperate.

GROUP BY CASE UserID
, Region

ORDER BY [User Name], Region

--注意因为group by在select语句之前执行,所以我们必须按USERID而不是[用户名]的别名来分组

【讨论】:

  • 非常感谢。我一直在尝试如何做到这一点但没有成功。非常感谢你。
  • 我认为您需要花一些时间来理解GROUP BY 子句和聚合的概念。这是你真正缺少的唯一一块。还要根据数据集来考虑数据,而不是逐行考虑;此外,如果名称在可以使用 Vlookup 的 Excel 工作表中,则在数据提取后使用 VLookup 并完全避免使用 case 语句。
  • 如果这是一个生产系统,名称可能在系统其他地方的表或视图中,您只需找到它们即可;可能通过查看外键关系来了解 USERID 如何与可能包含该名称的另一个表关联。
猜你喜欢
  • 2012-08-30
  • 2015-10-30
  • 2013-05-31
  • 2016-05-21
  • 1970-01-01
  • 2012-08-12
  • 2018-10-06
  • 1970-01-01
  • 2016-10-30
相关资源
最近更新 更多