【问题标题】:Substitute multiple names in a variable替换变量中的多个名称
【发布时间】:2020-10-04 07:13:24
【问题描述】:

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

如何在不重复所有代码行(总和)的情况下做到这一点,其中只有人名发生变化?我有一种感觉是动态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```


【问题讨论】:

  • 这是 SQL Server 还是任何其他数据库?由于未定义@nom2,上述代码将不起作用。您的 [FAMILIA][EVENTO] 集是否也来自变量?将@nom2、@real2 的代码也放入。
  • 这是 sql server。我已经编辑并定义了“nom2”。这些列来自已定义的表,而不是来自变量。 “real2”实际上是相同的代码,我可以复制代码并将“nom1”更改为“nom2”,它会起作用,但这并不是我真正想要的。

标签: sql sql-server variables dynamic


【解决方案1】:

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

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

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

【讨论】:

  • 是的,会尝试这种方式。谢谢!但难道不可能按照动态 sql 的方式做到这一点吗?
  • 可以,但是比较麻烦,容易出错,不推荐
  • 嗨@Srinika,您的代码运行完美,但是如何将总和的值插入表的新列中?表本身只有列名,但选择显示列名及其对应的值。
  • @rafamaniac,您需要到哪个表来获取数据?该表是否已有该列?
  • 您已经创建的表,但它只有名称。我希望它们出现在 Real 列中的值“创建表 tNom (nom varchar(100), Real)”
【解决方案2】:

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

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 的 Real 值。如果你想跨批次持久化,你可以使用临时表。

select Real from @NomReal Where nom = 'Pedro' 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2015-07-28
    • 2022-01-04
    • 2013-06-19
    • 2020-03-23
    • 2013-06-20
    • 1970-01-01
    相关资源
    最近更新 更多