Sql server 使用SQL GROUP BY CASE语句更新表

Sql server 使用SQL GROUP BY CASE语句更新表,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,FactAwardDetail具有给定StudentKey/AidYearkey/Termkey的多个记录(一个学生在给定aidyear/Termkey中可以有多个奖项)-可能需要按StudentKey、AidYearkey、Termkey分组 我需要根据以下逻辑使用FactAwardDetail.AwardKey更新FactAwardDetail.AwardLevelKey 如果给定StudentKey/AidYearKey/TermKey组合的任何记录满足以下要求: DimAward -

FactAwardDetail具有给定StudentKey/AidYearkey/Termkey的多个记录(一个学生在给定aidyear/Termkey中可以有多个奖项)-可能需要按StudentKey、AidYearkey、Termkey分组

我需要根据以下逻辑使用FactAwardDetail.AwardKey更新FactAwardDetail.AwardLevelKey

如果给定StudentKey/AidYearKey/TermKey组合的任何记录满足以下要求:

DimAward
--------  
AwardKey (PK)  
TypeCode  
SourceCode  
SourceKey  

CREATE TABLE [Final].[DimAward](
    [AwardKey] [int] IDENTITY(1,1) NOT NULL,
    [SourceKey] [varchar](10) NOT NULL,
    [SourceCode] [varchar](10) NOT NULL,
    [TypeCode] [varchar](10) NOT NULL,
 CONSTRAINT [pk_DimAward] PRIMARY KEY NONCLUSTERED 
(
    [AwardKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [uq_DimAward_SourceKey] UNIQUE CLUSTERED 
(
    [SourceKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) 
ON [PRIMARY]
) ON [PRIMARY]

GO

FactAwardDetail
----------------
AwardKey (FK to DimAward.AwardKey)  
AidYearkey  
StudentKey  
TermKey  
AwardLevelKey  

CREATE TABLE [Final].[FactAwardDetail](
    [AwardDetailKey] [int] IDENTITY(1,1) NOT NULL,
    [AwardKey] [int] NOT NULL,
    [AidYearKey] [int] NOT NULL,
    [StudentKey] [int] NOT NULL,
    [TermKey] [int] NOT NULL,
    [AwardLevelKey] [int] NOT NULL,
 CONSTRAINT [pk_FactAwardDetail] PRIMARY KEY NONCLUSTERED 
(
    [AwardDetailKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [uq_FactAwardDetail_CompoundID] UNIQUE NONCLUSTERED 
(
    [StudentKey] ASC,
    [AidYearKey] ASC,
    [TermKey] ASC,
    [AwardKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
set ad.AwardLevelkey = ad.awardkey  
set ad.AwardLevelKey for remaining records for the same StudentKey/AidYearkey/Termkey combination to -1
set ad.AwardLevelkey = ad.awardkey
set rest of ad.AwardLevelKey for remaining records for the same StudentKey/AidYearkey/Termkey combination to -1
然后

如果没有任何记录满足上述条件,则按如下方式查找新的条件: 如果给定StudentKey/AidYearkey/Termkey组合的任何记录满足以下要求:

DimAward
--------  
AwardKey (PK)  
TypeCode  
SourceCode  
SourceKey  

CREATE TABLE [Final].[DimAward](
    [AwardKey] [int] IDENTITY(1,1) NOT NULL,
    [SourceKey] [varchar](10) NOT NULL,
    [SourceCode] [varchar](10) NOT NULL,
    [TypeCode] [varchar](10) NOT NULL,
 CONSTRAINT [pk_DimAward] PRIMARY KEY NONCLUSTERED 
(
    [AwardKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [uq_DimAward_SourceKey] UNIQUE CLUSTERED 
(
    [SourceKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) 
ON [PRIMARY]
) ON [PRIMARY]

GO

FactAwardDetail
----------------
AwardKey (FK to DimAward.AwardKey)  
AidYearkey  
StudentKey  
TermKey  
AwardLevelKey  

CREATE TABLE [Final].[FactAwardDetail](
    [AwardDetailKey] [int] IDENTITY(1,1) NOT NULL,
    [AwardKey] [int] NOT NULL,
    [AidYearKey] [int] NOT NULL,
    [StudentKey] [int] NOT NULL,
    [TermKey] [int] NOT NULL,
    [AwardLevelKey] [int] NOT NULL,
 CONSTRAINT [pk_FactAwardDetail] PRIMARY KEY NONCLUSTERED 
(
    [AwardDetailKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [uq_FactAwardDetail_CompoundID] UNIQUE NONCLUSTERED 
(
    [StudentKey] ASC,
    [AidYearKey] ASC,
    [TermKey] ASC,
    [AwardKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
set ad.AwardLevelkey = ad.awardkey  
set ad.AwardLevelKey for remaining records for the same StudentKey/AidYearkey/Termkey combination to -1
set ad.AwardLevelkey = ad.awardkey
set rest of ad.AwardLevelKey for remaining records for the same StudentKey/AidYearkey/Termkey combination to -1
然后

如果所有记录都不满足上述两个条件,则按如下方式查找新的条件:

如果给定StudentKey/AidYearkey/Termkey组合的任何记录满足以下要求:

DimAward
--------  
AwardKey (PK)  
TypeCode  
SourceCode  
SourceKey  

CREATE TABLE [Final].[DimAward](
    [AwardKey] [int] IDENTITY(1,1) NOT NULL,
    [SourceKey] [varchar](10) NOT NULL,
    [SourceCode] [varchar](10) NOT NULL,
    [TypeCode] [varchar](10) NOT NULL,
 CONSTRAINT [pk_DimAward] PRIMARY KEY NONCLUSTERED 
(
    [AwardKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [uq_DimAward_SourceKey] UNIQUE CLUSTERED 
(
    [SourceKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) 
ON [PRIMARY]
) ON [PRIMARY]

GO

FactAwardDetail
----------------
AwardKey (FK to DimAward.AwardKey)  
AidYearkey  
StudentKey  
TermKey  
AwardLevelKey  

CREATE TABLE [Final].[FactAwardDetail](
    [AwardDetailKey] [int] IDENTITY(1,1) NOT NULL,
    [AwardKey] [int] NOT NULL,
    [AidYearKey] [int] NOT NULL,
    [StudentKey] [int] NOT NULL,
    [TermKey] [int] NOT NULL,
    [AwardLevelKey] [int] NOT NULL,
 CONSTRAINT [pk_FactAwardDetail] PRIMARY KEY NONCLUSTERED 
(
    [AwardDetailKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [uq_FactAwardDetail_CompoundID] UNIQUE NONCLUSTERED 
(
    [StudentKey] ASC,
    [AidYearKey] ASC,
    [TermKey] ASC,
    [AwardKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
set ad.AwardLevelkey = ad.awardkey  
set ad.AwardLevelKey for remaining records for the same StudentKey/AidYearkey/Termkey combination to -1
set ad.AwardLevelkey = ad.awardkey
set rest of ad.AwardLevelKey for remaining records for the same StudentKey/AidYearkey/Termkey combination to -1
然后 设置ad.AwardLevelkey=ad.awardkey 将同一StudentKey/AidYearkey/Termkey组合的其余记录的ad.AwardLevelKey的其余部分设置为-1

如果没有一条记录满足上述3个条件,我将需要重复这个模式几次


如果您能帮助我编写t-sql语句,我将不胜感激。

您不能使用if-then-else之类的构造。SQL是为集合操作而设计的,所以可以这样使用它。首先,您需要有一个有序的SourceKey列表:

SELECT 1
From DimAward a INNER JOIN
FactAwardDetail ad on a.AwardKey = ad.AwardKey
Where a.SourceKey = 'presm'
group by ad.StudentKey, ad.AidYearKey, ad.TermKey
它不需要是表变量,只要对您有用。然后将所有记录更新为-1,我们随后将更新具有匹配奖励的行。然后,您需要为给定的ad.StudentKey、ad.AidYearKey、ad.TermKey组合找到最佳(最高优先级)组合。将其包装在CTE中,并使用它更新表格:

declare @SourceKeyPriority table
(
  Priority int, SourceKey varchar(10)
)
insert into @SourceKeyPriority values (1,'powell')
insert into @SourceKeyPriority values (2,'regt')
insert into @SourceKeyPriority values (3,'presm')

在此处使用示例行创建SQLFIDLE或post create table语句。您需要在此处使用“UPDATE FROM”和“IF ELSE”。我已添加create table语句和示例行。谢谢。这正是我想要的。