SQL 代码简化或者优化

shuohuameijiang 2018-06-24 01:19:49

select '零售自营收入',SUM(HasTaxMoney) totalHasTaxMoney from Mall_FinaceData
where VersioId in(
select ID from Mall_FinaceDictVersion
where DictIdSnap like '%'+ cast((select ID from Mall_FinaceDict where DictName='自营') as nvarchar(100)) +'%'
and DictIdSnap like '%'+ cast((select ID from Mall_FinaceDict where DictName='零售') as nvarchar(100)) +'%'
)
union all
select '零售联营收入',SUM(HasTaxMoney) totalHasTaxMoney from Mall_FinaceData
where VersioId in(
select ID from Mall_FinaceDictVersion
where DictIdSnap like '%'+ cast((select ID from Mall_FinaceDict where DictName='联营') as nvarchar(100)) +'%'
and DictIdSnap like '%'+ cast((select ID from Mall_FinaceDict where DictName='零售') as nvarchar(100)) +'%'
)

表中的数据如下图,请教如何简化和优化SQL代码?
...全文
372 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
文盲老顾 2018-06-28
  • 打赏
  • 举报
回复
select * from (
select sum(HasTaxMoney) as _sum,VersionID
from Mall_FinaceData
where PeriodDate between '2017-1-1' and '2017-12-31'
and isDelete=0
group by VersionID
) a
cross apply (
select (
select distinct ''+y.DictName from Mall_FinaceDictVersion x
inner join Mall_FinaceDict y on charindex(convert(nvarchar(100),y.ID),x.DictIdSnap)>0
where y.DictName in ('自营','零售','游乐','收入','联营','水吧')
order by charindex(y.DictName,'游乐零售水吧自营联营收入')
for xml path('')
) as tp
) b
文盲老顾 2018-06-28
  • 打赏
  • 举报
回复
那你最好提供几个数据的示例,然后才能想办法

Mall_FinaceDictVersion的DiciIdSnap的值是什么样的,Mall_FinaceDict表的ID和DictName值是什么样的
shuohuameijiang 2018-06-27
  • 打赏
  • 举报
回复
你的执行后结果如图:

但我想要的效果是这样的:

请教你,应该怎样改呢?

引用 3 楼 superwfei 的回复:
select * from (
select sum(HasTaxMoney) as _sum,VersionID
from Mall_FinaceData
where PeriodDate between '2017-1-1' and '2017-12-31'
and isDelete=0
group by VersionID
) a
cross apply (
select (
select y.DictName from Mall_FinaceDictVersion x
inner join Mall_FinaceDict y on charindex(convert(nvarchar(100),y.ID),x.DictIdSnap)>0
for xml path('')
) as tp
) b
文盲老顾 2018-06-25
  • 打赏
  • 举报
回复
引用 4 楼 yenange 的回复:
建表的时候就应该有一个专门的分类表, 清楚明确地对应, 而不是用 LIKE。
用了模糊查询, 要优化就很麻烦的了, 效率受影响是绝对的。

可以分步骤来做, 部分数据查出来放临时表, 后面再连接操作


历史遗留问题是没办法弄的,真要改数据库结构,等于整站重做一遍,我现在的数据库结构调整完了两年,网站代码还没全部重写完成。。。。只能用触发器同步数据库数据
吉普赛的歌 2018-06-25
  • 打赏
  • 举报
回复
建表的时候就应该有一个专门的分类表, 清楚明确地对应, 而不是用 LIKE。
用了模糊查询, 要优化就很麻烦的了, 效率受影响是绝对的。

可以分步骤来做, 部分数据查出来放临时表, 后面再连接操作
文盲老顾 2018-06-25
  • 打赏
  • 举报
回复
select * from (
select sum(HasTaxMoney) as _sum,VersionID
from Mall_FinaceData
where PeriodDate between '2017-1-1' and '2017-12-31'
and isDelete=0
group by VersionID
) a
cross apply (
select (
select y.DictName from Mall_FinaceDictVersion x
inner join Mall_FinaceDict y on charindex(convert(nvarchar(100),y.ID),x.DictIdSnap)>0
for xml path('')
) as tp
) b
shuohuameijiang 2018-06-24
  • 打赏
  • 举报
回复
你写的我不是很理解。DictName 不属于 Mall_FinaceDictVersion表。上面我只截取了一部分脚本,完整的SQL见图,多了发不上来。

引用 1 楼 roy_88 的回复:
你的表结构决定了语句不会高效,最少你要满足3范式设计
,数据量不大时可尝试用以下方法,
SELECT CASE WHEN MFDV2.DictName=N'自营' THEN N'零售自营收入'
ELSE N'零售联营收入'
END AS Type
, SUM(HasTaxMoney) AS totalHasTaxMoney
FROM Mall_FinaceData AS MFD
CROSS APPLY
(SELECT TOP 1
DictName
FROM Mall_FinaceDictVersion AS MFDV
WHERE MFD.VersioId=MFDV.ID
AND EXISTS (SELECT 1
FROM Mall_FinaceDict
WHERE DictName IN ( N'自营', N'联营' )
AND MFDV.DictIdSnap LIKE '%'+RTRIM(ID) +'%')
AND EXISTS (SELECT 1
FROM Mall_FinaceDict
WHERE DictName=N'零售'
AND MFDV.DictIdSnap LIKE '%'+RTRIM(ID) +'%')) AS MFDV2
GROUP BY MFDV2.DictName;
中国风 2018-06-24
  • 打赏
  • 举报
回复
你的表结构决定了语句不会高效,最少你要满足3范式设计
,数据量不大时可尝试用以下方法,
SELECT CASE WHEN MFDV2.DictName=N'自营' THEN N'零售自营收入'
ELSE N'零售联营收入'
END AS Type
, SUM(HasTaxMoney) AS totalHasTaxMoney
FROM Mall_FinaceData AS MFD
CROSS APPLY
(SELECT TOP 1
DictName
FROM Mall_FinaceDictVersion AS MFDV
WHERE MFD.VersioId=MFDV.ID
AND EXISTS (SELECT 1
FROM Mall_FinaceDict
WHERE DictName IN ( N'自营', N'联营' )
AND MFDV.DictIdSnap LIKE '%'+RTRIM(ID) +'%')
AND EXISTS (SELECT 1
FROM Mall_FinaceDict
WHERE DictName=N'零售'
AND MFDV.DictIdSnap LIKE '%'+RTRIM(ID) +'%')) AS MFDV2
GROUP BY MFDV2.DictName;
本书是Inside Microsoft SQL Server 2005系列四本著作中的一本。它详细介绍了T-SQL的内部体系结构,包含了非常全面的编程参考,提供了使用Transact-SQL(T-SQL)的专家级指导,囊括了非常全面的编程参考,揭示了基于集合的查询的强大威力,并包含大量来自专家们的参考和建议。本书适合专业数据库开发者、BI开发者、DBA和以SQL Server作为后台数据库的一般应用程序开发者,读者可以通过书中的最佳实践、高级技巧和代码示例来掌握这门复杂的编程语言,以切合实际的方案来解决复杂的实际问题。   深入理解T-SQL体系结构,充分利用高级T-SQL查询技术。   本书深入介绍了T-SQL的内部体系结构,揭示了基于集合的查询的强大威力,并包含大量来自专家们的参考和建议。通过本书提供的最佳实践和示例代码,数据库开发人员和管理员完全可以掌握这门复杂的编程语言,以切合实际的方案来解决复杂的实际问题。通过本书,你将学习到如何:理解逻辑和物理的查询处理;使用方法论优化查询;在查询中用TOP选项修改数据;用递归逻辑、具体化路径或嵌套集合解决方案查询特殊的数据结构;通过逻辑难题提高你的逻辑能力并掌握查询问题的核心等。   你将学习到如何:   理解逻辑和物理的查询处理;   使用方法论优化查询;   解决关系分区问题;   使用CTE和排名函数简化优化解决方案;   用各种技术聚合数据,包括附加属性、旋转、直方图和分组因子;   在查询中用TOP选项修改数据;   用递归逻辑、具体化路径或嵌套集合解决方案查询特殊的数据结构;   通过逻辑难题提高你的逻辑能力并掌握查询问题的核心; 内容简介 本书是Inside Microsoft SQL Server 2005系列四本著作中的一本。本书及其续篇——《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》介绍了SQL Server 2005中高级T-SQL查询、查询优化及编程相关的知识。这两本书侧重于解决实践中的常见问题,并讨论了解决这些问题的方法。它们将向你揭示基于集合(set-based)查询的强大威力,并解释为什么它比使用游标的过程化编程(procedural programming)更具优势。同时,它还会教你识别使用基于游标解决方案与基于集合解决方案的优劣。   书中还讲述了其他几种争议较多的构造(camstruct)——如临时表、动态执行、XML和.NET集成——它们在具有强大功能的同时,也具有极大的风险。   本书适合于需要编写或检查T-SQL代码的有经验的T-SQL程序员和数据库专业人员。读者可从中学到大量精湛的技巧,这些技巧会充实您的工具箱和编码技能,并让您顺利地开发出高效的解决方案。 作者简介 Itzik Ben-Gan是Solid Quality Learning的首席导师和创始人。他从1999年开始便一直是SQL Server方面的Microsoft MVP,在世界各地讲授 T-SQL查询、编程和查询优化相关的课程,并提供相关咨询服务。他在SQL Server Magazine和MSDN上发表了多篇文章,并被邀请在许多专题会议上做过报告,包括TechEd、DevWeek、PASS和SQL Server Connections。 目录 序 前言 致谢 引言  本书的组织  系统要求  安装示例数据库  更新  代码示例  本书支持 第1章 逻辑查询处理  逻辑查询处理中的各个阶段   逻辑查询处理阶段简介  Customers/Orders场景下的示例查询  逻辑查询处理步骤详解   步骤1:执行笛卡尔乘积(交叉联接)   步聚2:应用ON筛选器(联接条件)   步骤3:添加外部行(Outer Row)   步骤4:应用WHERE筛选器   步骤5:分组   步骤6:应用CUBE或ROLLUP选项   步骤7:应用HAVING筛选器   步骤8:处理SELECT列表   步骤9:应用DISTINCT子句   步骤10:应用ORDER BY子句   步骤11:应用TOP选项  SQL Server 2005中新的逻辑处理阶段   表运算符   OVER子句   集合操作  结论 第2章 物理查询处理  查询处理期间的数据流  编译   Algebrizer   优化   使用查询计划   更新计划  结论   致谢 第3章 查询优化  本章用到的示例数据  优化方法论   分析实例级的等待   联系等待和队列   确定方案   细化到数据库/文件级别   细化到进程级别   优化索引/查询  查询优化工具   syscacheobjects   清空缓存   动态管理对象   STATISTICS IO   测量查询的运

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧