Sql 替换变量中的多个名称
我需要为更多的名称设置多个变量,例如@nom2(@Real2)、@nom3(@Real3) 我如何做到这一点而不重复所有代码行(Sum),其中只有人名发生更改?我有一种感觉是动态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
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)”中的值