如何解决将表值传递给变量
我有一个包含名称和一些值的表。我想将与名称关联的值传递到另一个表中以预填充值列表。我不确定通过创建函数或过程来解决这个问题的最佳方法。
下面是我现在必须手动设置变量的查询。但是,我想手动将其他表中的值传递给它。我该怎么做?
Name|AVG |DEV
A |1.89|.74
B |2.43|1.20
C |.74 |.12
我想在下面的查询中传递该表中的所有值。将表中的 AVG 值放入下面查询中的 @AVG 变量,将表中的 DEV 值放入下面的 @deviation 表中。
结果可以放入新表或查询中。
DECLARE @avg DECIMAL(4,1) = 1.89 --this would be row 1 (value A) avg
DECLARE @deviation DECIMAL(4,1) = 0.74 --this would be row 1 (value A) DEV
DECLARE @startnum DECIMAL(4,1)= @Avg - (@deviation * 3)
DECLARE @endnum DECIMAL(4,1)= @Avg + (@deviation * 3)
;
WITH gen AS (
SELECT CAST(@startnum AS decimal(4,1)) AS Mulitiple
UNION ALL
SELECT CAST(Mulitiple+.1 AS decimal(4,1)) FROM gen WHERE Mulitiple+.1<=@endnum
)
SELECT A.Mulitiple,CAST(((A.Mulitiple-@avg)/@deviation) AS DECImAL(4,2)) AS Zscore,Z.Y AS Area
FROM gen AS A
LEFT JOIN STAT..Zscore AS Z ON CAST(((A.Mulitiple-@avg)/@deviation) AS DECImAL(4,2)) = CAST(Z.Zscore AS decimal(4,2))
--WHERE Z.Y IS NOT NULL
option (maxrecursion 10000)
解决方法
此方法使用名为 dbo.fnNumbers 的 tally function 来生成 zscore 的范围。
dbo.fnNumbers
create function [dbo].[fnNumbers](
@zero_or_one bit,@n bigint)
returns table with schemabinding as return
with n(n) as (select null from (values (1),(2),(3),(4)) n(n))
select 0 n where @zero_or_one = 0
union all
select top(@n) row_number() over(order by (select null)) n
from n na,n nb,n nc,n nd,n ne,n nf,n ng,n nh,n ni,n nj,n nk,n nl,n nm,n np,n nq,n nr;
查询
drop table if exists #abc;
go
create table #abc(
[name] varchar(2),[avg] decimal(4,1),[dev] decimal(4,1));
insert #abc([name],[avg],[dev]) values
('a',1.89,.74),('b',2.43,1.20),('c',0.74,.12);
select a.[name],gen.multiple,gen_z.zscore,z.y as area
from #abc a
cross apply dbo.fnNumbers(1,cast(2*(a.dev*3)+0.1 as decimal(4,1))*10) fn
cross apply (values (cast((a.[avg]-(a.dev*3)+(fn.N-1)*0.1) as decimal(4,1)))) gen(multiple)
cross apply (values (cast(((gen.multiple-a.[avg])/a.dev) AS decimal(4,2)))) gen_z(zscore)
left join stat..zscore z on gen_z.zscore=cast(z.zscore as decimal(4,2))
order by a.[name],gen.multiple;
,
如果我理解正确,您可以使用 JOIN
。在这种情况下,您可以使用 CROSS JOIN
:
SELECT ABC.*,A.Mulitiple,CAST(((A.Mulitiple - ABC.avg) / ABC.dev) AS DECImAL(4,2)) AS ZScore,Z.Y AS Area
FROM ABC CROSS JOIN
gen a LEFT JOIN
STAT..ZScore Z
ON CAST(((A.Mulitiple - abc.avg)/ abc.dev) AS DECIMAL(4,2)) = CAST(Z.Zscore AS decimal(4,2))
--WHERE Z.Y IS NOT NULL
您可以使用以下方法避免两次公式:
SELECT ABC.*,v.ZScore,Z.Y AS Area
FROM ABC CROSS JOIN
gen a CROSS APPLY
(VALUES (CAST((A.Mulitiple - ABC.avg) / ABC.dev AS DECImAL(4,2))
) v(Zscore) LEFT JOIN
STAT..ZScore Z
ON v.ZScore = CAST(Z.Zscore AS decimal(4,2))
--WHERE Z.Y IS NOT NULL
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。