微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将表值传递给变量

如何解决将表值传递给变量

我有一个包含名称和一些值的表。我想将与名称关联的值传递到另一个表中以预填充值列表。我不确定通过创建函数或过程来解决这个问题的最佳方法

下面是我现在必须手动设置变量的查询。但是,我想手动将其他表中的值传递给它。我该怎么做?

例如我有一个名为 ABC 的表,在该表中有 3 个值

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 举报,一经查实,本站将立刻删除。