Sql server 使用SQL GROUP BY CASE语句更新表
FactAwardDetail具有给定StudentKey/AidYearkey/Termkey的多个记录(一个学生在给定aidyear/Termkey中可以有多个奖项)-可能需要按StudentKey、AidYearkey、Termkey分组 我需要根据以下逻辑使用FactAwardDetail.AwardKey更新FactAwardDetail.AwardLevelKey 如果给定StudentKey/AidYearKey/TermKey组合的任何记录满足以下要求: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 -
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语句和示例行。谢谢。这正是我想要的。