mysql - 使用分隔符将 SQL 数据拆分为 3 列

标签 mysql sql-server vba excel

我正在使用 Excel VBA 并使用 OleDB 连接到 PGSQL。不幸的是,oledb 不允许引用聚合函数之外的列,其中 group by 已应用于表,因此我必须连接数据,但我无法将数据(latestBMI)拆分回 3 个单独的列( eventdate|weight|bmi), 因为权重和 bmi 值的长度不同,但被管道分隔符分开。

下面是提取后的表格:

master_id :   latestBMI
251       :   2008-05-08|84|26.8
2848      :   1992-11-23|86.71|27.3
2026      :   2002-04-16|105|31.6
22316     :   2014-02-28|107.955|35.1
16633     :   2005-07-04|70|25
9545      :   1997-04-08|82.73|24.9

我一直在使用各种方法尝试 SUBSTRING、CHARINDEX、LEN、LEFT|RIGHT,但都失败了。 这是我当前的代码,但重量和 bmi 的 SUBSTRING 元素是我的问题:

Const sqlconnection = "Provider=oledb;"

Dim conn As New Connection
conn.ConnectionString = sqlconnection
conn.Open
Dim rs As Recordset

Sheets("Sheet1").Select
Range("A1").Select

Dim DATA As String
DATA = "SELECT latest.master_id, " _
& "SUBSTRING(latestBMI,1,10) eventdate, " _
& "SUBSTRING(latestBMI,12,CHARINDEX('|',latestBMI,RIGHT(latestBMI,7)) weight, " _
& "SUBSTRING(latestBMI,20,4) BMI " _
& "FROM ( " _
& "SELECT master_id, " _
& "MAX(CAST(eventdate AS VARCHAR(10)) + '|' + RIGHT(weightkg,7)+ '|' + RIGHT(bmi,4)) AS latestBMI " _
& "FROM weight " _
& "GROUP BY master_id) as latest " _
& "LEFT JOIN person p on latest.master_id = p.entity_id "

Set rs = conn.Execute(DATA)
With ActiveSheet.QueryTables.Add(Connection:=rs, Destination:=Range("A1"))
    .Refresh
End With

如何使用竖线分隔符将它们分成 3 个单独的列?

最佳答案

我假设你的表有 4 列

master_id、BMI1、BMI2、BMI3 和 BMI4

您可以使用以下查询生成 INSERT 语句,然后在您的数据库上运行它们

select 'insert into newTable (master_id, BMI1, BMI2, BMI3) values( ' +
   cast(master_id as varchar) + ',''' + replace(latestBMI, '|', ''',''') + ''')'
from #t

它生成以下语句(使用您的示例数据)

insert into newTable (master_id, BMI1, BMI2, BMI3) values( 251,'2008-05-08','84','26.8')
insert into newTable (master_id, BMI1, BMI2, BMI3) values( 2848,'1992-11-23','86.71','27.3')
insert into newTable (master_id, BMI1, BMI2, BMI3) values( 2026,'2002-04-16','105','31.6')
insert into newTable (master_id, BMI1, BMI2, BMI3) values( 22316,'2014-02-28','107.955','35.1')
insert into newTable (master_id, BMI1, BMI2, BMI3) values( 16633,'2005-07-04','70','25')
insert into newTable (master_id, BMI1, BMI2, BMI3) values( 9545,'1997-04-08','82.73','24.9')

如果列不是整数,您可以修改 SELECT 语句以获得您需要的内容。但是生成的 INSERT 仍然有效,即使您的列是数字。

关于mysql - 使用分隔符将 SQL 数据拆分为 3 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36436446/

相关文章:

mysql - PROCEDURE 的参数数量不正确

c# - 如何在 .net 中读取 SQL Server 架构信息?

c# - Entity Framework 到远程服务器(连接字符串)

excel - 为什么同时存在 Worksheet 和 Sheet 对象?

vba - 使用 VBA 退出 Excel 会导致运行时错误 424

mysql - 我可以使用 "last update"时间戳来选择要更新的 MySQL 记录吗?

python - MySQL Workbench 迁移向导 python 错误

excel - VBA Excel : A find and replace for charts titles

php - mysql在PHP中选择单列作为单维数组

sql-server - tableau 中的计算字段以查找第一行是成功还是失败