sql将查询结果1行中的多列合成1列

上周一位同事向我询问了这个 SQL。
他正在使用 SQL Server 编写报告。
你看,SQL Server按照你这样写是没有问题的。

SQL 选择 第 1 列, ISNULL(col2 , '') + ISNULL(col3 , '') + ISNULL(col4 , ''), 第5 栏 来自表名
ISNULL 函数是 SQL Server 中的标准函数,它将 null 替换为空字符串并将其连接起来。
去年我在杭州做项目的时候也经常使用它。

但是如果问其他数据库,那就要看具体情况了。
例如Oracle有NVL函数,需要改变写法:
sql 选择 第 1 列, NVL(col2 , '') + NVL(col3 , '') + NVL(col4 , ''), 第5 栏 来自表名
在MySQL端,也可以直接使用IFNULL或COALESCE:
sql 选择 第 1 列, IFNULL(col2 , '') + IFNULL(col3 , '') + IFNULL(col4 , ''), 第5 栏 -
或者 选择 第 1 列, 合并(col2 ,'')+合并(col3 ,'')+合并(col4 ,''), 第5 栏 来自表名
我不太清楚SQLite,我通常不使用它。
如果您使用 SQLite,最好自己测试一下。
我记得我想它可能会被写成不同的。

关键是使用ISNULL/NVL/IFNULL/COALESCE。
添加字符串时使用+连接。
之前在武汉有一个项目,一个实习生给CONCAT写了+。
结果整个SQL跑了很久就报错了。
我当时就骂了他。
年轻人写代码确实不能马虎。

所以如果你在SQL Server中使用这种写法那么是没有问题的。
对于其他数据库,只需将 ISNULL 替换为相应的函数即可。

sql 多列分组 如何把stname相同的数据合并成一列 得到 张三 90 1 99 1 李四 80 2 90 2 这种格式 sql语句

上周试过这个。
确实可以。

格式为“张三9 0,1 ,9 9 ,1 ”。

SQL是这样写的:
sql 选择 名称, 东西(( 选择 &3 9 ;,&3 9 ; + 强制转换(syname AS varchar(1 0)) + &3 9 ;,&3 9 ; + 强制转换(stid AS varchar(1 0)) 从表 WHERE a.stname = stname FOR XML 路径(&3 9 ;&3 9 ;) ), 1 , 1 , &3 9 ;&3 9 ; ) FROM 表 AS a 按名称分组
我朋友测试过,05 以上版本没有问题。

这取决于你。

SQL 字符串函数如何实现多列拼接?

那天在地铁上,看到有人在手机上查看SQL拼接笔记,突然想起了当年写的那些玩意儿。
记得在我公司的旧服务器上,我必须将SQL Server 2 008 数据库中的三个字段连接起来,并使用ISNULL函数逐层添加,这让我感到头大。

CONCAT 函数跨数据库使用确实非常安全。
不过我突然想到,如果要join的字段太多了,比如8 列,这样写CONCAT(COL1 , '-', COL2 , '-', ...)岂不是很无聊?当时我尝试过用动态SQL,但是写的方式太复杂了,领导说,“我们下次再聊。

||运算符在 PostgreSQL 中很容易使用,但我已经为使用 Oracle1 2 c 的客户端编写了一个脚本。
结果,版本太旧,无法支持||。
当我临时切换到CONCAT并将分隔符写为“--”时,输出充满了双杠。
最后我不得不使用REPLACE函数来处理它。

处理NULL值尤其重要。
我记得之前导入数据时,我丢失了特定用户的地址字段,并直接使用 ISNULL(ADDRESS, 'Unknown') 。
所有导出结果均为“未知”。
后来发现这个字段原本是VARCHAR(2 5 5 )类型,并且空值的默认值是NULL而不是''。

我更喜欢使用“|”作为分隔符,因为“-”不太可能与数字混淆。
例如,要将用户ID和姓名组合起来,使用“姓名|ID:1 2 3 ”就非常清楚了。
然而,有一次我在写报告的时候,老板坚持要我用“,”。
结果中文字符集和英文字符集混在一起,导出PDF时全部都是乱码。
真的够了。

数据库兼容性肯定是一个陷阱。
CONCAT 在 SQLServer2 01 2 之前不可用。
还有||不能与 Oracle1 1 g 或更早版本一起使用。
SQLite 就更奇怪了。
不支持|| CONCAT 也没有。
只能与+结合,但使用+会将NULL值变成空字符串,需要额外判断。

编写SQL拼接时,基本上就是修改一个模板。
首先 CONCAT,所有列均使用 COALESCE('') 进行处理,分隔符为 '|'。
不过最近在学习Power Query的过程中,我发现M语言的拼接更加灵活。
SQL将来会变得那么流行吗?
等一下,我想我忘了说些什么。
我去西藏出差,海拔3 5 00米。
在写SQL拼接的时候,我就搞糊涂了,差点写成COALESCE而不是COALESCESE。
幸运的是,一位同事救了我。

sql多行多列合并成一行多列,

说白了,可以使用Oracle中的SUM、MAX等函数来完成。
null值不参与比较(1 1 g中就是这种情况,其他版本要自己尝试)。
比如去年我们跑了那个电商项目,统计了每个产品三个价位的最高价格。
我们直接写了SELECT Product、MAX(标价)、MAX(第二价)、MAX(三价)FROM table GROUP BY products。
我们跑了 3 000 个级别的数据,几秒钟就得到了结果。
还有一点就是SUM是求和,比如统计每个产品的三个价格级别的总金额,SELECT 产品,SUM(价格),SUM(第二个价格),SUM(三个价格)FROM table GROUP BY 产品,这个在按部门核算的时候特别有用。
还有另一个关键细节。
如果字段包含NULL,MAX会直接跳过,不会报错,但是SUM会算为0,很多人没有注意到这一点。
说实话,这很尴尬。
上次有同事因为这个把所有的报表都搞乱了。

一开始我以为SUM和MAX可以直接互换使用,后来发现是错误的。
SUM 默认将 NULL 值处理为 0,而 MAX 则简单地忽略它们。
等等,还有一件事。
这些函数针对Oracle中的大数据量进行了很好的优化,但是不要向表中添加太多无用的列,否则GROUP BY会运行缓慢。
建议使用EXPLAIN PLAN来检查执行计划,避免陷入陷阱。