我有以下查询,它是公用表表达式的一部分。我不明白“选择-1”语句的功能。它明显不同于“EXISTS”语句中使用的“Select 1”。有什么想法吗?
select days_old,
count(express_cd),
count(*),
case
when round(count(express_cd)*100.0/count(*),2) < 1 then '0'
else ''
end ||
cast(decimal(round(count(express_cd)*100.0/count(*),2),5,2) as varchar(7)) ||
'%'
from foo.bar
group by days_old
union all
select -1, -- Selecting the -1 here
count(express_cd),
count(*),
case
when round(count(express_cd)*100.0/count(*),2) < 1 then '0'
else ''
end ||
cast(decimal(round(count(express_cd)*100.0/count(*),2),5,2) as varchar(7)) ||
'%'
from foo.bar
where days_old between 1 and 7
答案 0 :(得分:2)
它只是为返回的每一行选择数字“减1”,就像“select 1”将为返回的每一行选择数字“one”。
顺便说一句,“选择1”语法在EXISTS语句中使用没有什么特别之处;它只是选择一些随机值,因为EXISTS需要返回一条记录而一条记录需要数据;数字1就足够了。
为什么你会这样做,我不知道。
答案 1 :(得分:1)
当你有一个union语句时,union的每个部分都必须包含相同的列。从我看到这个时看到的内容来看,第一个陈述是给你一行每天的价值,然后是每天的一些统计数据。工会的第二部分是给你一个只有一周左右的记录的摘要。由于天老栏与此处不相关,因此他们将假值作为占位符以进行联合。当然,这只是基于多年来阅读数千个查询的猜测。可以肯定的是,我需要实际运行代码。
由于您说这是一个CTE,要真正理解为什么会发生这种情况,您可能需要查看它生成的数据以及在下一个使用CTE的查询中如何使用该数据。这可能会回答你的问题。
您所询问的内容基本上是关于贵公司独有的业务规则。真正的答案应该在于原始代码创建的任何需求文档。你应该去寻找它们并阅读它们。我们可以根据自己的经验做出猜测,但只有贵公司的人才能回答这里的问题。
如果找不到文档,那么您需要与使用数据并了解其需求的利益相关方进行对话(是的,直接对话,最好是亲自交谈)。只有在运行代码并分析结果后才能更好地理解返回数据的含义。
答案 2 :(得分:0)
根据您的查询,所有day_old在1到7之间的记录都将输出为&#39; -1&#39;,这就是select -1
所做的,这里没什么特别的,没有什么区别select -1
中的select 1
和exists
都会将记录输出为1或-1,它们会做同样的事情来检查是否有任何数据。
回到您的查询,我注意到您有一个union all
,并按union all
比较您选择连接的每四列,我猜您的任务是获得最终结果,其中days_old不在1之间和7并将结果与day_old结合起来,这是因为你在1到7之间取得了所有结果。
答案 3 :(得分:0)
这只是一个分组逻辑。
您的查询返回聚合 数据(计数和舍入)按days_old列加一个组分组,其中days_old在1到7之间。 因此,-1只是另一个附加组,它不能是1,因为days_old = 1是另一个有效组。
结果将是这样的:
row1:days_old = 1 count(*)= 2 ...
row2:days_old = 3 count(*)= 5 ...
row3:days_old = 9 count(*)= 6 ...
row4:days_old = -1 count(*)= 7