Sql 替换变量中的多个名称

Sql 替换变量中的多个名称,sql,sql-server,variables,dynamic,Sql,Sql Server,Variables,Dynamic,我需要为更多的名称设置多个变量,例如@nom2(@Real2)、@nom3(@Real3) 我如何做到这一点而不重复所有代码行(Sum),其中只有人名发生更改?我有一种感觉是动态SQL,但说实话,我真的不知道该怎么做 use Performance go declare @nom1 nvarchar(20) declare @nom2 nvarchar(20) declare @real1 int set @nom1 = 'Ricardo' set @nom2 = 'Pedro' set @Re

我需要为更多的名称设置多个变量,例如@nom2(@Real2)、@nom3(@Real3)

我如何做到这一点而不重复所有代码行(Sum),其中只有人名发生更改?我有一种感觉是动态SQL,但说实话,我真的不知道该怎么做

use Performance
go
declare @nom1 nvarchar(20)
declare @nom2 nvarchar(20)
declare @real1 int
set @nom1 = 'Ricardo'
set @nom2 = 'Pedro'
set @Real1 = (select(
sum (case when [SUPERVISOR] = @nom1 and [FAMILIA] = 'MEOFIBRA' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
sum (case when [SUPERVISOR] = @nom1 and [FAMILIA] = 'MEOCOBRE' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
sum (case when [SUPERVISOR] = @nom1 and [FAMILIA] = 'MEOSAT' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end)) from DOC```



根据给定的信息,我建议:

您不需要定义变量,而是可以创建一个表,向其中插入数据,并将其连接到查询,如下所示

Create table tNom (nom varchar(100))

insert into tNom values
('Ricardo'), ('Pedro')

select d.[SUPERVISOR], (
sum (case when [SUPERVISOR] = t.nom and [FAMILIA] = 'MEOFIBRA' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
sum (case when [SUPERVISOR] = t.nom and [FAMILIA] = 'MEOCOBRE' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
sum (case when [SUPERVISOR] = t.nom and [FAMILIA] = 'MEOSAT' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end)) as SumByNom
from DOC d
left join tNom t on d.[SUPERVISOR] = t.nom
Group by d.[SUPERVISOR]
如果不再需要该表,可以创建临时表。 如果您需要除nom之外的引用,您可以在tNom表中有额外的RealCol列,并按该列分组,然后选择RealCol,以及nom

编辑新需求:

drop table tNom
Create table tNom (nom varchar(100), SumColumn Real)

insert into tNom (nom) values 
('Ricardo'), ('Pedro')


Update t Set t.SumColumn = ColSum
From tNom t
inner join
(
    Select t.nom, 
        sum (case when [SUPERVISOR] = t.nom and [FAMILIA] = 'MEOFIBRA' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
        sum (case when [SUPERVISOR] = t.nom and [FAMILIA] = 'MEOCOBRE' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
        sum (case when [SUPERVISOR] = t.nom and [FAMILIA] = 'MEOSAT' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) as ColSum
    from DOC d
    left join tNom t on d.[SUPERVISOR] = t.nom
    Group by t.nom
) q on q.nom = t.nom

根据给定的信息,我建议:

您不需要定义变量,而是可以创建一个表,向其中插入数据,并将其连接到查询,如下所示

Create table tNom (nom varchar(100))

insert into tNom values
('Ricardo'), ('Pedro')

select d.[SUPERVISOR], (
sum (case when [SUPERVISOR] = t.nom and [FAMILIA] = 'MEOFIBRA' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
sum (case when [SUPERVISOR] = t.nom and [FAMILIA] = 'MEOCOBRE' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
sum (case when [SUPERVISOR] = t.nom and [FAMILIA] = 'MEOSAT' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end)) as SumByNom
from DOC d
left join tNom t on d.[SUPERVISOR] = t.nom
Group by d.[SUPERVISOR]
如果不再需要该表,可以创建临时表。 如果您需要除nom之外的引用,您可以在tNom表中有额外的RealCol列,并按该列分组,然后选择RealCol,以及nom

编辑新需求:

drop table tNom
Create table tNom (nom varchar(100), SumColumn Real)

insert into tNom (nom) values 
('Ricardo'), ('Pedro')


Update t Set t.SumColumn = ColSum
From tNom t
inner join
(
    Select t.nom, 
        sum (case when [SUPERVISOR] = t.nom and [FAMILIA] = 'MEOFIBRA' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
        sum (case when [SUPERVISOR] = t.nom and [FAMILIA] = 'MEOCOBRE' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
        sum (case when [SUPERVISOR] = t.nom and [FAMILIA] = 'MEOSAT' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) as ColSum
    from DOC d
    left join tNom t on d.[SUPERVISOR] = t.nom
    Group by t.nom
) q on q.nom = t.nom

您可以定义表变量并保存名称和更新实值,如下所示。下面是未测试的代码,因为您没有提供示例值。但是,你应该明白这一点

DECLARE @NomReal TABLE(Nom nvarchar(20), Real int)

INSERT INTO @NomReal (Nom)
VALUES ('Ricardo'),('Pedro');

UPDATE n
SET Real = (
sum (case when [FAMILIA] = 'MEOFIBRA' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
sum (case when [FAMILIA] = 'MEOCOBRE' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
sum (case when [FAMILIA] = 'MEOSAT' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end))  
@NomReal AS n
INNER JOIN Doc as d
ON d.Supervisor = n.Nom
现在,通过查询表变量,可以获得每个nom的实际值。如果您想在批处理之间保持这种状态,可以使用临时表

从@NomReal中选择Real,其中nom='Pedro'

您可以定义表变量,保存名称并更新实际值,如下所示。下面是未测试的代码,因为您没有提供示例值。但是,你应该明白这一点

DECLARE @NomReal TABLE(Nom nvarchar(20), Real int)

INSERT INTO @NomReal (Nom)
VALUES ('Ricardo'),('Pedro');

UPDATE n
SET Real = (
sum (case when [FAMILIA] = 'MEOFIBRA' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
sum (case when [FAMILIA] = 'MEOCOBRE' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end) +
sum (case when [FAMILIA] = 'MEOSAT' and [EVENTO] = 'VB' then [QUANTIDADE] else 0 end))  
@NomReal AS n
INNER JOIN Doc as d
ON d.Supervisor = n.Nom
现在,通过查询表变量,可以获得每个nom的实际值。如果您想在批处理之间保持这种状态,可以使用临时表

从@NomReal中选择Real,其中nom='Pedro'

这是SQL Server还是其他数据库?由于未定义@nom2,上述代码将不起作用。您的
[FAMILIA]
[EVENTO]
也来自一个变量吗?把@nom2和@real2的代码也放进去。这是sql server。我已经编辑并定义了“nom2”。这些列来自已定义的表,而不是来自变量。“real2”将是字面上相同的代码,我可以复制代码并将“nom1”更改为“nom2”,它会工作,但这不是我真正想要的。这是SQL Server还是其他数据库?由于未定义@nom2,上述代码将不起作用。您的
[FAMILIA]
[EVENTO]
也来自一个变量吗?把@nom2和@real2的代码也放进去。这是sql server。我已经编辑并定义了“nom2”。这些列来自已定义的表,而不是来自变量。“real2”将是字面上相同的代码,我可以复制代码并将“nom1”更改为“nom2”,它会工作,但这不是我真正想要的。是的,我会尝试这种方式。谢谢!但是,难道不可能按照动态sql的思路来实现这一点吗?这是可能的,但繁琐、容易出错、不推荐hi@Srinika您的代码工作得非常完美,但是我如何才能在表的新列中插入总和的值呢?表本身只有列名,但select会显示列名及其对应的值。@rafamaniac,您需要到哪个表中获取数据?该表已经有该列了吗?您已经创建的表,但它只有名称。我希望它们出现在实数列“createtabletnom(nomvarchar(100),Real)”中的值是这样尝试的。谢谢!但是,难道不可能按照动态sql的思路来实现这一点吗?这是可能的,但繁琐、容易出错、不推荐hi@Srinika您的代码工作得非常完美,但是我如何才能在表的新列中插入总和的值呢?表本身只有列名,但select会显示列名及其对应的值。@rafamaniac,您需要到哪个表中获取数据?该表已经有该列了吗?您已经创建的表,但它只有名称。我希望它们出现在实数列“Create table tNom(nom varchar(100),Real)”中的值