【问题标题】:How to create a dynamic variable to load a field in a table in SQL Server如何创建动态变量以加载 SQL Server 表中的字段
【发布时间】:2018-05-14 21:34:29
【问题描述】:

我遇到了一个场景,我必须为保存特定字段数据的选择查询创建一个动态变量。这是场景

表“客户”有以下数据

Column0 Column1 Column2     Column3     Column4 Column5
--------------------------------------------------------
H       123X                11/27/2017  C       10.23
D       123X    78462F103   11/28/2017  A       112.35
D       123X    55024U109   11/28/2017  A       25.30
H       456X                11/27/2017  B       5263.44
D       456X    78462F103   11/28/2017  A       23.00
D       456X    55024U109   11/28/2017  A       12123.00
D       456X    78462F103   11/28/2017  A       56.08
D       456X    55024U109   11/28/2017  C       45.07

现在我必须在 Column0='H' 时使用 Sum(column5) 创建变量,并在 Column0='D' 时将其加载到 Column5 中,直到 Column0='H' 值发生变化(表有多个 H 值)。

示例: 当 Column0='H' 可以说时,我必须计算变量 如果 Column0='H' 则 Variable=Sum(Column5) 即 '5.36'。现在当 Coulmn1='D' 时,Column5 的值应该加载为 5.63,当新的 Column0='H' 到来时,变量的值更改为 '6.33',它应该将更新后的值加载到 'D' 记录中。

对此有何建议?

【问题讨论】:

  • 感谢您发布一些示例数据。这有帮助。但是,您在这个新专栏中想要什么完全不清楚。给定您的样本,输出应该是什么?
  • “直到”?基于什么排序?期望的结果将有助于澄清。
  • 我必须在 Column0='H' 时计算变量,如果 Column0='H' 那么 Variable=Sum(Column5) 是 '5.36'。现在当 Coulmn1='D' 时,Column5 的值应该加载为 5.63,当新的 Column0='H' 到来时,变量的值更改为 '6.33',它应该将更新后的值加载到 'D' 记录中。跨度>
  • 发布您的预期结果。这是没有意义的。我可以断言 H 表示标题,D 表示细节。
  • 制作两张表,一张是H数据,一张是D数据。现在你已经有了一个关系数据库!现在您不必执行诸如“在行更改为另一个 H 之前执行操作”之类的操作。因为一张表只有 H,一张只有 D。您在第 1 列中有一个唯一的事务编号,用于将数据关联在一起。那么你所要做的就是学习 GROUP BY Column1 和 SUM。

标签: sql sql-server tsql ssis msbi


【解决方案1】:

假设我是正确的,当 Column0 = H 时,您希望每个 Column1 的所有行的总和成为 Column5 中的新值,您可以这样做。

请注意,我必须先在表格中创建示例数据,然后才能执行任何操作。

declare @Something table 
(
    Column0 char(1)
    , Column1 char(4)
    , Column2 varchar(20)
    , Column3 date
    , Column4 char(1)
    , Column5 decimal (9,2)
)

insert @Something values
('H', '123X', '', '11/27/2017', 'C', 10.23)
, ('D', '123X', '78462F103', '11/28/2017', 'A', 112.35)
, ('D', '123X', '55024U109', '11/28/2017', 'A', 25.30)
, ('H', '456X', '', '11/27/2017', 'B', 5263.44)
, ('D', '456X', '78462F103', '11/28/2017', 'A', 23.00)
, ('D', '456X', '55024U109', '11/28/2017', 'A', 12123.00)
, ('D', '456X', '78462F103', '11/28/2017', 'A', 56.08)
, ('D', '456X', '55024U109', '11/28/2017', 'C', 45.07)
;

with SummaryData as
(
    select *
        , NewCol5 = case when Column0 = 'H' then sum(Column5) over(partition by Column1) else Column5 end
    from @Something
)

update SummaryData
set Column5 = NewCol5

select *
from @Something

如果不是更早,我会非常强烈地敦促立即放弃这种设计。它充满了错误。更糟糕的是,这看起来像是销售信息。使用这种设计,您无法跟踪诸如 SalesTax、运输、折扣等...所有您想要跟踪的关于订单的事物。

【讨论】:

  • 我的印象是源是一个平面文件。因此我的解决方案
【解决方案2】:

我的印象是源是一个平面文件,并且正在提供一个 SSIS 解决方案。

read data -> Conditional Split ("H" and "D")

Dpath
Multicast -> Write out detail records
  -> Aggregate on Col1 --> Merge Join to H path

H path:
Merge Join on Col1 to Aggregated Data

Finally either AddH Col5 to Aggregate or replace col 5 with aggregate (it's not clear in question.)

Write out your header records.

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 2016-03-26
    • 1970-01-01
    • 2015-03-06
    • 2011-02-23
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    相关资源
    最近更新 更多