【问题标题】:SQL Database Design for SSISSSIS 的 SQL 数据库设计
【发布时间】:2011-09-22 05:52:36
【问题描述】:

好的,我的第一个问题,所以这里。

目前用户正在使用一个巨大的 Access 应用程序。他们希望 Web 应用程序具有基于 Access 数据的某些功能并进行一些修改。

好的,没问题。我使用 Access to SQL 迁移助手将数据转换过来,然后编写了一些从 Web 端执行的 SSIS 包,以允许根据需要更新应用程序。这里的一切都很好。

这是我有点难过的地方。有两种类型的进口,季度和年度。季度很好,但年度进口导致问题。年度导入可以用于已通过的预算或建议的预算(每个都保存在单独的 Access 数据库中)。对于每种类型的年度导入,我都有一个 SSIS 包。信息所在的表格如下..

CREATE TABLE Budget
(
    BudgetID           uniqueidentifier NOT NULL,
    ProjectNumber      int NOT NULL,
    SubProjectNumber   varchar(6) NOT NULL,
    FiscalYearBegin    int NOT NULL,
    FiscalYearEnd      int NOT NULL,
    Sequence           int NULL,
    QuarterImportDate  datetime NULL,
    ProposedBudget     money NULL,
    AdoptedBudget      money NULL,

    CONSTRAINT PK_Budget PRIMARY KEY CLUSTERED 
    (
        BudgetID ASC
    ),

    CONSTRAINT uc_Budget UNIQUE NONCLUSTERED 
    (
        ProjectNumber ASC,
        SubProjectNumber ASC,
        FiscalYearBegin ASC,
        FiscalYearEnd ASC,
        Sequence ASC
    )
)

此外,特定年份的预算可以有多个版本,例如 ProjectSubProjectFiscalYearBeginFiscalYearEnd。这就是为什么有一个序列号。

所以问题就变成了,因为我有 2 个不同的 SSIS 包,每个包都是针对 1 个特定列(ProposedBudgetAdoptedBudget)的更新语句,我没有有效的方法来跟踪正确的顺序.

如果我可以更清楚地说明这一点,请告诉我,任何建议都会很棒!

谢谢。

【问题讨论】:

  • BudgetId 和 Sequence 有什么区别?
  • BudgetID 只是该行的唯一标识符 (NEWID)。该序列旨在成为当年的版本。例如,您正在为 2010/2011 财年进行首次导入。每个项目和子项目的 FiscalYearBegin = 2010、FiscalYearEnd= = 2011 和 Sequence = 0。下一次导入的 Sequence = 1
  • 所以你将 ProposedBudget 作为序列 1 导入,那么 AdoptedBudget 是对同一行的单独更新,序列 1?您确定每个提议的预算和通过的预算都是一对一的吗?是否可能有更多的建议预算或采用的预算,这样您的一些序列只有一个?
  • 确切地说,我将 ProposedBudget 作为 Sequence1 导入,然后 AdoptedBudget 是对带有 sequence1 的同一行的单独更新。我还没有完善第二次更新的更新声明。这是 ProposedBudget 将多次更改的事情,但 Adopted 在当年将是相同的,因此每个 FiscalYearBegin 和 FiscalYearEnd 的每个序列都将采用相同的方法,只是理论上每个新序列都会有不同的提议。

标签: sql sql-server-2008 database-design ssis relational-database


【解决方案1】:

这样的事情会让你得到下一个带有空 AdoptedBudget 的项目,但我认为当有多个 AdoptedBudget 时你需要一个光标。我正在考虑使用更新进行嵌套子查询,但是当有多个 AdoptedBudgets 时,这将不起作用。听起来在源应用程序中,每当他们添加 AdoptedBudget 时,他们应该选择一个 ProposedBudget,以便可以创建关系。这样一来,哪个 AdoptedBudget 与哪个 ProposedBudget 就很清楚了,这将是一个简单的连接。我有几乎相同的场景,但不同的是我没有保留所有版本。我只需要保留最新的“ProposedBudget”和最新的“AdoptedBudget”。尝试对它们全部排序有点困难。

  --get the smallest SequenceId with an unfilled AdoptedBudget
  Select min(SequenceID), 
    ProjectNumber, 
    FiscalYearBegin, 
    SubProjectNumber --any other fields needed for the join
  From Budgets b
  Where AdoptedBudget is null
  Group By 
    ProjectNumber, 
    FiscalYearBegin, 
    SubProjectNumber --any other fields needed for the join


--This won't work I don't believe
Update Budgets
Set AdoptedBudget = BudgetAmount
From Budgets b
Inner Join SourceAdoptedBudgets ab on 
  b.ProjectNumber = ab.ProjectNumber
  b.FiscalYearBegin = ab.FiscalYearBegin
  b.FiscalYearEnd = ab.FiscalYearEnd
Inner Join
(
  --get the smallest SequenceId with an unfilled AdoptedBudget
  Select min(SequenceID), 
    ProjectNumber, 
    FiscalYearBegin, 
    SubProjectNumber --any other fields needed for the join
  From Budgets b
  Where AdoptedBudget is null
  Group By 
    ProjectNumber, 
    FiscalYearBegin, 
    SubProjectNumber --any other fields needed for the join
) as nextBudgets
on --the join fields again

【讨论】:

  • 我正在考虑为 AdoptedBudget 更新语句找到 Null。只是无法将碎片拼凑在一起。他们确实从应用程序中选择了他们正在执行的导入类型(Adropted、Proposed)。如果我错了,请纠正我,但检查这种方式会强制用户先上传 Proposed 然后 Adopted?
  • 是的,他们必须先上传建议的内容。我会按关键字段分组计数,以便通过加入和提议加入,看看计数不匹配的频率。似乎有人可能会上传 3 个拟议预算,然后最后一个被采纳的预算。它与哪些拟议预算相符?我会去掉 Proposed/Adopted Budget 字段,而是有一个 BudgetAmount 和 VersionType 指示它是 Proposed 或 Adopted。您可以从两个源中进行选择,合并它们,然后使用分区的 row_number 字段在 importdate 上生成序列
  • 我一开始就想到了这个,这就是我最终做的事情,所以谢谢你让我走上了正确的道路。我放置了一个 BudgetAmount 字段,并有一个 Proposed/Adopted 标识符。我很惊讶你得到了我的解释!你太棒了。我整天和 0 个技术人员一起工作,所以这是一个很好的舒适区。谢谢!
【解决方案2】:

类似这样的使用 BudgetType。当然,您可能会为这些或 IsAdopted 位字段创建一个代码表。但你明白了。

Select 
budgets.*
,row_number() over(partition by 
   ProjectNumber
  ,SubProjectNumber
  ,FiscalYearBegin
  ,FiscalYearEnd 
   order by QuarterImportDate) as SequenceNumber
From
(
  Select
  ProjectNumber
  ,SubProjectNumber
  ,FiscalYearBegin
  ,FiscalYearEnd
  ,QuarterImportDate
  ,'Proposed' as BudgetType
  ,ProposedBudget as Budget
  From sourceProposed

  Union

  Select
  ProjectNumber
  ,SubProjectNumber
  ,FiscalYearBegin
  ,FiscalYearEnd
  ,QuarterImportDate
  ,'Adopted' as BudgetType
  ,AdoptedBudget as Budget
  From sourceAdopted
) as budgets

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2019-11-27
    • 2015-05-17
    • 2016-11-30
    相关资源
    最近更新 更多