这个sql里的case需要动态根据t_code表变化

时间: 2024-02-21 18:57:01 浏览: 14
如果需要动态根据t_code表的内容生成CASE WHEN语句,可以使用动态SQL来实现。可以先使用SELECT语句查询t_code表的内容,然后将查询结果拼接成CASE WHEN语句,并将拼接后的语句作为字符串动态执行。下面是一个示例SQL语句: ``` DECLARE @sql NVARCHAR(MAX) = N'SELECT '; SELECT @sql = @sql + 'MAX(CASE WHEN code = ''' + code + ''' THEN value END) AS ' + code + ', ' FROM t_code; SET @sql = LEFT(@sql, LEN(@sql) - 2) + ' FROM t_data;'; EXEC sp_executesql @sql; ``` 上述SQL语句中,首先声明一个变量@sql来存储动态生成的SQL语句。然后使用SELECT语句查询t_code表的内容,并将拼接后的CASE WHEN语句和其他SQL语句拼接成完整的动态SQL语句。最后,使用sp_executesql存储过程来动态执行生成的SQL语句。这样可以根据t_code表的内容动态生成对应的CASE WHEN语句,从而实现将t_data表中的数据按照t_code表的code列的值进行行列转换。
相关问题

我有一个字典表t_code,其中字段有code,codedesc,有一个数据表t_data,其中字段有id,code,value,写一个sql,结果里的列名为code值,行数据为t_data,不使用pivot

可以使用CASE WHEN语句来实现将t_data表中的数据按照code列的值进行行列转换,结果中的列名为code值,行数据为t_data表的其他列的值。下面是一个示例SQL语句: ``` SELECT MAX(CASE WHEN code = 'code1' THEN value END) AS code1, MAX(CASE WHEN code = 'code2' THEN value END) AS code2, MAX(CASE WHEN code = 'code3' THEN value END) AS code3 FROM t_data; ``` 上述SQL语句中,使用了三个CASE WHEN语句来将t_data表中的数据按照code列的值进行行列转换。在每个CASE WHEN语句中,当code列的值等于特定的code值时,将value列的值作为结果输出,否则输出NULL。最后,使用MAX函数来获取每个code值对应的value列的最大值,从而将t_data表中的多条记录转换为一条记录。

优化这条sql select PROD_DIS_TYPE , case when PROD_DIS_TYPE = '1' then DECODE(sum(FIRST_BIZ), 0,0, ROUND(sum(case when CONTRACT_CODE = 'NHT-1904506' then FIRST_BIZ else 0 end) / sum(FIRST_BIZ), 2))::int else 0 end as FIRST_BIZ , case when PROD_DIS_TYPE = '2' then DECODE(sum(APPR_DESIGN_PROD), 0, 0, ROUND(sum(case when CONTRACT_CODE = 'NHT-1904506' then APPR_DESIGN_PROD else 0 end) / sum(APPR_DESIGN_PROD), 2))::int else 0 end as APPR_DESIGN_PROD from T_SPDI_CONT_SUB_PROJ where UNITERM_CODE = 'N1900620-04-008' and SUB_PROJ_CODE = 'N1900620-04-302' and PROD_DIS_TYPE = '1' group by PROD_DIS_TYPE

这个 SQL 查询语句存在多个问题,需要进行优化: 1. 可以使用预编译语句,避免重复解析 SQL 语句。 2. 可以使用 EXISTS 子查询代替 WHERE 子句中的 AND 条件,可以更好地利用索引。 3. 可以使用 WITH 语句中的子查询,减少代码重复。 4. 可以使用 JOIN 代替 WHERE 中的等值条件,可以更好地利用索引。 5. 可以使用更简洁的 SQL 语句实现相同的功能。 下面是优化后的 SQL 查询语句: ``` WITH FIRST_BIZ_SUM AS ( SELECT SUM(FIRST_BIZ) AS FIRST_BIZ_SUM FROM T_SPDI_CONT_SUB_PROJ WHERE UNITERM_CODE = 'N1900620-04-008' AND SUB_PROJ_CODE = 'N1900620-04-302' ), APPR_DESIGN_PROD_SUM AS ( SELECT SUM(APPR_DESIGN_PROD) AS APPR_DESIGN_PROD_SUM FROM T_SPDI_CONT_SUB_PROJ WHERE UNITERM_CODE = 'N1900620-04-008' AND SUB_PROJ_CODE = 'N1900620-04-302' ) SELECT PROD_DIS_TYPE, CASE WHEN PROD_DIS_TYPE = '1' THEN COALESCE( ROUND( SUM(CASE WHEN CONTRACT_CODE = 'NHT-1904506' THEN FIRST_BIZ ELSE 0 END) / NULLIF(FIRST_BIZ_SUM.FIRST_BIZ_SUM, 0), 2 )::INT, 0) ELSE 0 END AS FIRST_BIZ, CASE WHEN PROD_DIS_TYPE = '2' THEN COALESCE( ROUND( SUM(CASE WHEN CONTRACT_CODE = 'NHT-1904506' THEN APPR_DESIGN_PROD ELSE 0 END) / NULLIF(APPR_DESIGN_PROD_SUM.APPR_DESIGN_PROD_SUM, 0), 2 )::INT, 0) ELSE 0 END AS APPR_DESIGN_PROD FROM T_SPDI_CONT_SUB_PROJ WHERE UNITERM_CODE = 'N1900620-04-008' AND SUB_PROJ_CODE = 'N1900620-04-302' AND PROD_DIS_TYPE IN ('1', '2') GROUP BY PROD_DIS_TYPE; ``` 此优化后的 SQL 查询语句,通过使用 WITH 子句和 COALESCE 函数,将重复的代码块抽象出来,提高了代码的可读性和可维护性。同时,使用 JOIN 和 EXISTS 子查询代替 WHERE 子句中的等值条件,以及使用 NULLIF 函数避免除以 0 的问题,可以更好地利用索引,提高查询效率。

相关推荐

帮我解析一下这个java错误,Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT C.PERIOD_NO, C.BILL_MONTH, C.LOCAL_AIR_CODE, C.INT_DOM_INDICATOR, 'GLOBAL' AS CHECK_CODE, CASE WHEN COUPON_COUNT_GLOBAL = COUPON_COUNT_REPORT AND TAX_AMT_GLOBAL = TAX_AMT_REPORT AND ISC_AMT_GLOBAL = ISC_AMT_REPORT AND UATP_AMT_GLOBAL = UATP_AMT_REPORT AND GROSS_AMT_GLOBAL = GROSS_AMT_REPORT THEN 'S' ELSE 'F' END AS CHECK_RESULT_IND, TAX_AMT_GLOBAL AS TAX_AMT_ACTUAL, TAX_AMT_REPORT AS TAX_AMT_EXPECTED, ISC_AMT_GLOBAL AS ISC_AMT_ACTUAL, ISC_AMT_REPORT AS ISC_AMT_EXPECTED, UATP_AMT_GLOBAL AS UATP_AMT_ACTUAL, UATP_AMT_REPORT AS UATP_AMT_EXPECTED, GROSS_AMT_GLOBAL AS GROSS_AMT_ACTUAL, GROSS_AMT_REPORT AS GROSS_AMT_EXPECTED, COUPON_COUNT_GLOBAL AS COUPON_COUNT_ACTUAL, COUPON_COUNT_REPORT AS COUPON_COUNT_EXPECTED FROM ( ( SELECT BILL_MONTH, PERIOD_NO, LOCAL_AIR_CODE, INT_DOM_INDICATOR, SUM(COUPON_COUNT) AS COUPON_COUNT_GLOBAL, CASE WHEN SUM(GROSS_AMT_BILLING) IS NULL THEN 0 ELSE SUM(GROSS_AMT_BILLING) END AS GROSS_AMT_GLOBAL, CASE WHEN SUM(BILL_TAX_BILLING) IS NULL THEN 0 ELSE SUM(BILL_TAX_BILLING) END AS TAX_AMT_GLOBAL, CASE WHEN SUM(ISC_AMT_BILLING) IS NULL THEN 0 ELSE SUM(ISC_AMT_BILLING) END AS ISC_AMT_GLOBAL, CASE WHEN SUM(UATP_AMT_BILLING) IS NULL THEN 0 ELSE SUM(UATP_AMT_BILLING) END AS UATP_AMT_GLOBAL FROM OWB_GLOBAL_REPORT WHERE REPORT_TYPE = 'R' AND DELETE_IND IS NULL AND PERIOD_NO = ? AND BILL_MONTH = ? AND INT_DOM_INDICATOR = ? AND LOCAL_AIR_CODE = ? GROUP BY BILL_MONTH, PERIOD_NO, LOCAL_AIR_CODE, INT_DOM_INDICATOR) C[*] INNER JOIN ( SELECT BILL_MONTH, PERIOD_NO, LOCAL_AIR_CODE, INT_DOM_INDICATOR, SUM(COUPON_COUNT) AS COUPON_COUNT_REPORT, CASE WHEN SUM(GROSS_AMT_BILLING) IS NULL THEN 0 ELSE SUM(GROSS_AMT_BILLING) END AS GROSS_AMT_REPORT, CASE WHEN SUM(BILL_TAX_BILLING) IS NULL THEN 0 ELSE SUM(BILL_TAX_BILLING) END AS TAX_AMT_REPORT, CASE WHEN SUM(ISC_AMT_BILLING) IS NULL THEN 0 ELSE SUM(ISC_AMT_BILLING) END AS ISC_AMT_REPORT, CASE WHEN SUM(UATP_AMT_BILLING) IS NULL THEN 0 ELSE SUM(UATP_AMT_BILLING) END AS UATP_AMT_REPORT FROM OWB_REPORT WHERE ADJ_MONTH IS NULL AND PERIOD_NO = ? AND BILL_MONTH = ? AND INT_DOM_INDICATOR = ? AND LOCAL_AIR_CODE = ? GROUP BY BILL_MONTH, PERIOD_NO, LOCAL_AIR_CODE, INT_DOM_INDICATOR) R ON C.BILL_MONTH = R.BILL_MONTH AND C.PERIOD_NO = R.PERIOD_NO AND C.LOCAL_AIR_CODE = R.LOCAL_AIR_CODE AND C.INT_DOM_INDICATOR = R.INT_DOM_INDICATOR )"; expected "UNION, EXCEPT, MINUS, INTERSECT, ORDER, OFFSET, FETCH, LIMIT, SAMPLE_SIZE, FOR, )";

最新推荐

recommend-type

node-v4.1.0-linux-x64.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

基于AT89S52的数字温度计设计说明.docx

基于AT89S52的数字温度计设计说明.docx
recommend-type

HTML+CSS+JS精品网页模板H108.rar

HTML5+CSS+JS精品网页模板,设置导航条、轮翻效果,鼠标滑动效果,自动弹窗,点击事件、链接等功能;适用于大学生期末大作业或公司网页制作。响应式网页,可以根据不同的设备屏幕大小自动调整页面布局; 支持如Dreamweaver、HBuilder、Text 、Vscode 等任意html编辑软件进行编辑修改; 支持包括IE、Firefox、Chrome、Safari主流浏览器浏览; 下载文件解压缩,用Dreamweaver、HBuilder、Text 、Vscode 等任意html编辑软件打开,只需更改源代码中的文字和图片可直接使用。图片的命名和格式需要与原图片的名字和格式一致,其他的无需更改。如碰到HTML5+CSS+JS等专业技术问题,以及需要对应行业的模板等相关源码、模板、资料、教程等,随时联系博主咨询。 网页设计和制作、大学生网页课程设计、期末大作业、毕业设计、网页模板,网页成品源代码等,5000+套Web案例源码,主题涵盖各行各业,关注作者联系获取更多源码; 更多优质网页博文、网页模板移步查阅我的CSDN主页:angella.blog.csdn.net。
recommend-type

node-v6.15.0-linux-armv7l.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

spring添加xml配置文件

1. 创建一个新的Spring配置文件,例如"applicationContext.xml"。 2. 在文件头部添加XML命名空间和schema定义,如下所示: ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依