1

SQL Server 2014

我正在尝试学习更好的 SQL 代码实践以提高性能。我正在继承一些旧代码,并想了解真正知道自己在做什么的人将如何改进它。

我试图将代码缩短为我现在正在处理的主要部分。似乎有比运行多个相关子查询更好的方法来获取原因代码(PersonalTraining、网球等)?但是,到目前为止,我无法让每个客户返回一行的结果。

第 3 方的最终结果必须保持不变。

客户可以有零到多个存储在表“asajoinmbr”中的原因代码

asajoinmbr

CREATE TABLE [dbo].[ASAJoinmbr](
 [cust_code] [char](10) NOT NULL,
 [mbr_code] [char](10) NOT NULL,
 [reason_code] [char](3) NULL,
 [associate_code] [char](10) NULL,
 [join_note] [ntext] NULL,
 [wants_contact] [char](1) NULL,
 [club] [smallint] NULL,
 [region] [char](4) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

在此处输入图像描述

asambr

CREATE TABLE [dbo].[ASAMembr](
 [cust_code] [nvarchar](10) NULL,
 [mbr_code] [nvarchar](10) NULL,
 [lname] [nvarchar](20) NULL,
 [fname] [nvarchar](20) NULL,
 [status] [nvarchar](6) NULL,
 [bdate] [datetime] NULL,
 [email] [nvarchar](80) NULL,
 [Club] [nvarchar](3) NULL,

) ON [PRIMARY]

strcustr

CREATE TABLE [dbo].[StrCustr](
[cust_code] [nvarchar](10) NULL,
[bridge_code] [nvarchar](10) NULL,
[bus_name] [nvarchar](30) NULL,
[status] [nvarchar](1) NULL,
[phone] [nvarchar](20) NULL,
[address1] [nvarchar](30) NULL,
[address2] [nvarchar](30) NULL,
[city] [nvarchar](20) NULL,
[state] [nvarchar](10) NULL,
[post_code] [nvarchar](10) NULL,
[cntry_abbrev] [nvarchar](3) NULL,
[cust_type] [nvarchar](10) NULL,
[obtained_date] [date] NULL,
[geo_code] [nvarchar](9) NULL,
[email] [nvarchar](80) NULL,
[club] [smallint] NULL,

) ON [PRIMARY]
GO

关于改进此代码的任何部分的任何想法?

select 

SC.Club as [Location],
(LTRIM(RTRIM(SC.Cust_Code))+Mem.Mbr_code) as [Customer Number],
Replace(LTRIM(RTRIM(mem.fname)),'"','-')  as [Customer First Name],
LTRIM(RTRIM(mem.lname)) as [Customer Last Name],
mem.email as [Customer Email Address],

(select 'Personal Training' from ASAJoinmbr ajm where sc.cust_code = 
ajm.cust_code and reason_code = 'PT' group by cust_code) as PersonalTraining,

(select 'Group Fitness' from ASAJoinmbr ajm where sc.cust_code = 
ajm.cust_code and (reason_code = 'GE' or reason_code = 'GF') group by 
cust_code) as GroupFitness,

(select 'Cardio/Weight'from ASAJoinmbr ajm where sc.cust_code = 
ajm.cust_code and (reason_code = 'CT' or reason_code = 'CV' or reason_code = 
'WT') group by cust_code) as CardioWeight,

(select 'Tennis'from ASAJoinmbr ajm where sc.cust_code = ajm.cust_code and 
(reason_code = 'TE' or reason_code = 'TN') group by cust_code) as Tennis,

(select 'Aquatics' from ASAJoinmbr ajm where sc.cust_code = ajm.cust_code 
and reason_code = 'AQ' group by cust_code) as Aquatics

from strcustr SC
INNER JOIN ASAMEMBR MEM 
    on SC.cust_code=MEM.Cust_code 
    and sc.club=mem.Club

Where  
DATEDIFF(year,(mem.bdate),GETDATE() ) >19
and (DATEDIFF(day, convert(date,sc.obtained_date,101),GETDATE() )= 14
        or (DATEDIFF(day, convert(date,sc.obtained_date,101),GETDATE() )=93 
and sc.status='A'))
and mem.status = 'A'
and mem.email is not null 
and  mem.email <>''
and (sc.bridge_code <> '94811' or sc.geo_code <> 'Goldsmbr')
and sc.cust_type<>'E'

group by 
sc.club,sc.cust_code,mem.mbr_code,mem.fname,mem.lname,mem.email

结果: 在此处输入图像描述

4

0 回答 0