下面的查询是公共表表达式的一部分。我不明白“选择-1”语句的作用。它明显不同于“存在”语句中使用的“Select1”。有什么想法吗?
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
发布于 2016-12-20 06:13:11
根据您的查询,在1到7之间使用days_old的所有记录都将输出为' -1 ',这就是select -1
所做的事情,这里没有什么特别的,在exists
中select -1
和select 1
之间也没有什么区别,两者都将以1或-1的形式输出记录,它们做同样的事情来检查是否有任何数据。
回到您的查询,我注意到您有一个union all
并比较了您选择的由union all
连接的每四列,我猜您的任务是使用days_old (而不是1到7之间)获得最终结果,并将结果与day_old组合起来,这是因为您在1到7之间使用了所有的结果。
发布于 2016-12-20 05:51:16
它只是为返回的每一行选择“减号”,就像"select 1“将为返回的每一行选择数字”1“一样。
顺便说一下,在EXISTS语句中使用"select 1“语法没有什么特别之处;它只是选择一些随机值,因为EXISTS需要返回一个记录,而一个记录需要数据;数字1就足够了。
你为什么要这么做,我不知道。
发布于 2016-12-20 07:07:02
当您有一个union语句时,联合的每个部分必须包含相同的列。从我读到的情况来看,第一条语句是,每一天的值给你一行,然后给出每一天的数据。工会的第二部分是给你一个总结,所有的记录只有一个星期左右。因为旧的列在这里不相关,他们把假值作为占位符来做联合。当然,这只是基于多年来读取数千个查询的猜测。当然,我需要实际运行teh代码。
既然您说这是一个CTE,要真正理解为什么会发生这种情况,您可能需要查看它生成的数据以及在下一个使用CTE的查询中如何使用该数据。这可能会回答你的问题。
你所要求的基本上是关于你的公司特有的商业规则。真正的答案应该在最初创建代码的任何需求文档中。你应该去找找看。我们可以根据自己的经验来猜测,但只有贵公司的人才能回答这里的原因。
如果您找不到文档,那么您需要与使用数据的涉众交谈(是的,直接交谈,最好是亲自交谈),并了解他们的需求。只有在运行代码并分析结果之后才能更好地理解返回的数据的含义。
https://stackoverflow.com/questions/41243881
复制相似问题