Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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
Sql 使用Union语句中的值进行计算_Sql_Sql Server_Union_Unpivot - Fatal编程技术网

Sql 使用Union语句中的值进行计算

Sql 使用Union语句中的值进行计算,sql,sql-server,union,unpivot,Sql,Sql Server,Union,Unpivot,在SQL Server中,我正在寻找在union select中重用值的最佳方法,以便在计算中使用这些值: 比如: 我知道的唯一方法是使用declare,比如: --------------------- declare @V1 as int declare @V2 as int select @V1 = max(value) @V2 = min(value) from table select @V1 union select @V2 union select @V1 + @V2 这是可

在SQL Server中,我正在寻找在union select中重用值的最佳方法,以便在计算中使用这些值:

比如:

我知道的唯一方法是使用declare,比如:

---------------------
declare @V1 as int
declare @V2 as int

select
@V1 = max(value)
@V2 = min(value)
from table

select @V1
union
select @V2
union
select @V1 + @V2

这是可行的,但不是有一种更简单的方法吗?

在SQL Server中,我建议
交叉应用
将列解压到行:

select x.v
from (select min(value) v1, max(value) v2 from mytable) t
cross apply (values (t.v1), (t.v2), (t.v1 + t.v2)) x(v)

在SQL Server中,我建议
cross apply
取消将列拆分为行:

select x.v
from (select min(value) v1, max(value) v2 from mytable) t
cross apply (values (t.v1), (t.v2), (t.v1 + t.v2)) x(v)

使用返回最小值和最大值的CTE:

with cte as (select min(value) min_value, max(value) max_value from tablename)
select min_value from cte
union
select max_value from cte
union
select min_value + max_value from cte

使用返回最小值和最大值的CTE:

with cte as (select min(value) min_value, max(value) max_value from tablename)
select min_value from cte
union
select max_value from cte
union
select min_value + max_value from cte

您可以使用STRING_SPLIT,因为它比pivot更好

declare @a as varchar
select @a=cast(min(value) as varchar)+','+cast(min(value)+max(value) as varchar)+','+cast(max(value) as varchar) 
from tablename

SELECT value
FROM STRING_SPLIT(@a, ',' )

您可以使用STRING_SPLIT,因为它比pivot更好

declare @a as varchar
select @a=cast(min(value) as varchar)+','+cast(min(value)+max(value) as varchar)+','+cast(max(value) as varchar) 
from tablename

SELECT value
FROM STRING_SPLIT(@a, ',' )

请用您正在运行的数据库标记您的问题:mysql、oracle、sqlserver?另外,请澄清您是有两个表(如第一个代码段中的表),还是只有一个表(如第二个代码块中的表)。如果最小值和最大值相同,将得到2行而不是3行。是-这种可能性非常小,但排序和重复删除只会降低查询效率。请用您正在运行的数据库标记您的问题:mysql、oracle、sqlserver?另外,请澄清您是有两个表(如第一个代码段中的表),还是只有一个表(如第二个代码块中的表)。如果最小值和最大值相同,将得到2行而不是3行。是-这种可能性非常小,但排序和重复删除只会降低查询效率。