对多个列使用 CROSS APPLY

2023-12-08

使用 SQL Server 第 3 天。

我正在尝试将 2 列分隔数据合并为表值函数的一个输出。这是我的数据:

enter image description here

我希望处理数据并将其放入以下格式的表中:

enter image description here

我目前trying使用这个 CROSS APPLY SQL 语句,但我不知道我在做什么。

USE [Metrics]
INSERT INTO dbo.tblSplitData(SplitKey, SplitString, SplitValues)
SELECT d.RawKey, c.*, e.*
FROM dbo.tblRawData d
CROSS APPLY dbo.splitstringcomma(d.DelimitedString) c, dbo.splitstringcomma(d.DelimitedValues) e

我对CROSS APPLY的研究有广泛的背景,我不明白它应该如何应用在这种场景中。我是否需要一个带有附加 CROSS APPLY 的子查询和一个联接来组合两个表值函数的返回?

这是我最初使用的 split 函数(我不记得作者是否注明出处):

CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX), @Delimiter CHAR(1))
RETURNS
 @returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN

 DECLARE @name NVARCHAR(255)
 DECLARE @pos INT

 WHILE CHARINDEX(@Delimiter, @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX(@Delimiter, @stringToSplit)  
  SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  INSERT INTO @returnList 
  SELECT @name

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
 END

 INSERT INTO @returnList
 SELECT @stringToSplit

 RETURN
END

编辑和修改查询

USE [Metrics] 
INSERT INTO dbo.tblSplitData(SplitKey, SplitString, SplitValues)
SELECT s.RawKey, s.SplitString, v.SplitValues
FROM (
SELECT d.RawKey, d.DelimitedString,
 c.item SplitString, c.rn
FROM dbo.tblRawData d
CROSS APPLY dbo.splitstring(d.DelimitedString, ',') c
) s

INNER JOIN

(
SELECT d.RawKey, d.DelimitedValues,
 c.item SplitValues, c.rn
FROM dbo.tblRawData d
CROSS APPLY dbo.splitstring(d.DelimitedValues, ',') c
) v
on s.RawKey = v.RawKey
and s.rn = v.rn;

如果我们可以看到您的分割字符串函数,可能会更容易回答这个问题。我的答案是使用我拥有的 split 函数的一个版本。

我将在您的分割函数中包含一个行号,您可以使用它来连接分割字符串和分割值。

分割功能:

CREATE FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))       
returns @temptable TABLE (items varchar(MAX), rn int)       
as       
begin      
    declare @idx int       
    declare @slice varchar(8000)   
    declare @rn int = 1 -- row number that increments with each value in the delimited string

    select @idx = 1       
        if len(@String)<1 or @String is null  return       

    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)   
        else       
            set @slice = @String       

        if(len(@slice)>0)  
            insert into @temptable(Items, rn) values(@slice, @rn)       

        set @String = right(@String,len(@String) - @idx)       
        set @rn = @rn +1

        if len(@String) = 0 break       
    end   
return 
end;

然后,如果要拆分多个列,则可以使用类似于以下内容的查询:

INSERT INTO dbo.tblSplitData(SplitKey, SplitString, SplitValues)
select s.rawkey,
  s.splitstring,
  v.splitvalues
from
(
  SELECT d.RawKey, d.delimitedstring, d.delimitedvalues, 
    c.items SplitString, 
    c.rn
  FROM dbo.tblRawData d
  CROSS APPLY dbo.Split(d.DelimitedString, ',') c
) s
inner join
(
  SELECT d.RawKey, d.delimitedstring, d.delimitedvalues, 
    c.items SplitValues, 
    c.rn
  FROM dbo.tblRawData d
  CROSS APPLY dbo.Split(d.DelimitedValues, ',') c
) v
  on s.rawkey = v.rawkey
  and s.delimitedstring = v.delimitedstring
  and s.rn = v.rn;

See SQL 摆弄演示

这使用两个生成分割值列表的子查询,然后使用分割函数创建的行号将它们连接起来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对多个列使用 CROSS APPLY 的相关文章

  • 查找SQL记录中的并发用户数

    我有以下结构的表 UserID StartedOn EndedOn 1 2009 7 12T14 01 2009 7 12T15 01 2 2009 7 12T14 30 2009 7 12T14 45 3 2009 7 12T14 47
  • ROUTINE_NAME 和 SPECIFIC_NAME 之间有什么区别?

    在 INFORMATION SCHEMA ROUTINES 视图中 存在 ROUTINE NAME 和 SPECIFIC NAME 按照MSDN http msdn microsoft com en us library ms188757
  • 基于 PHP 的 CSV 编辑器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道用 PHP 编写的在线 CSV 编辑器允许用户打开 编辑和保存给定的 CSV 文件 我能找到的只
  • 删除 SQL Server 上的所有扩展属性

    如何以可编写脚本的方式删除 SQL Server 上的所有扩展属性 如果您想要一个能够一次性删除所有扩展属性的脚本 请使用 Jamie Thomson 创建的脚本 该脚本将为所有扩展属性生成删除 您可以从这里下载article http s
  • pandas.read_csv FileNotFoundError:尽管路径正确,但文件 b'\xe2\x80\xaa'

    我正在尝试加载一个 csv文件使用pd read csv 尽管文件路径正确并且使用原始字符串 但当我收到错误时 函数仍会起作用 import pandas as pd df pd read csv C Users user Desktop
  • ORACLE 更新并返回 OLD 和 NEW 值

    PL SQL Oracle 12c 中是否有与此 T SQL 查询等效的内容 UPDATE A SET A columnA 10 WHERE A columnB lt 30 OUTPUT INSERTED DELETED 查询更新表A 同时
  • 如何使用meteor将存储在数据库中的json转换为csv

    我想下载从数据库 nodeDB 生成的 CSV 文件 该文件包含以下条目 这些条目应该仅充当标题 META TEMPLATE NAME B TEMPLATE GROUP Product KEYWORDS cc TEMPLATE SUBGRO
  • 主键和代理键有什么区别?

    我用谷歌搜索了很多 但没有找到带有示例的确切直接答案 任何例子都会更有帮助 主键是表中的唯一键 您选择它可以最好地唯一标识表中的记录 所有表都应该有一个主键 因为如果您需要更新或删除一条记录 您需要知道如何唯一标识它 代理键是人工生成的键
  • 选择视图的列

    我正在尝试选择 a 的列名称view以类似的方式选择information schema columns 我似乎找不到办法做到这一点 有其他人以前这样做过或者知道这是否可能吗 information schema columns Table
  • 从表变量中获取列的明确名称

    我可以这样声明一个表变量 DECLARE tv source TABLE c1 int providerName varchar 50 providerSMS varchar 50 如果我执行以下命令 我会看到类似于以下内容的表名称 468
  • sp_MSforeachtable 在每个表上执行过程

    我想打印一些动态查询来对数据库中的所有表执行过程 这是我到目前为止所写的 EXEC SP MSFOREACHTABLE IF EXISTS SELECT FROM INFORMATION SCHEMA COLUMNS WHERE COLUM
  • pandas 读取列中带有额外逗号的 csv

    我正在阅读一个基本的 csv 文件 其中各列用逗号分隔 列名称如下 userid username body 但是 正文列是一个可能包含逗号的字符串 显然这会导致一个问题 pandas 会抛出一个错误 CParserError Error
  • 对依赖列进行 ALTER TABLE

    我正在尝试将主键的列数据类型从 int 更改为tinyint 该列是其他表中的外键 因此 我收到以下错误 消息 5074 级别 16 状态 1 第 1 行 对象 PK User tbl 为 取决于列 appId 消息 5074 第 16 级
  • 基于 Pandas 中特殊字符分隔列中的每个项目进行聚合

    我输入的数据如下 Date Investment Type Medium 1 1 2000 Mutual Fund Stocks Fixed Deposit Real Estate Own Online Through Agent 1 2
  • Excel VBA:导入日期为 dd/mm/yyyy 的 CSV

    我知道这是一个相当常见的问题 但我尚未找到可靠的解决方案 我的数据位于 csv 文件中 第一列格式为 dd mm yyyy 当我使用 Workbooks OpenText 打开它时 它默认为 mm dd yyyy 直到它发现它认为的月份超过
  • 将数据库导出为脚本;序列设置不正确

    我想从 SQL Server 2016 获取数据库并将其设置在客户站点的 2014 服务器上 在 SSMS 中 我选择任务 gt 生成脚本 并获取包含所有内容的 SQL 文件CREATE TABLE声明等 我的印象是序列没有正确生成 这些序
  • varchar 值的转换溢出了 int 列

    对于某些值 nReservationID SELECT phoneNumber CASE WHEN ISNULL rdg2 nPhoneNumber 0 0 THEN ISNULL rdg2 nMobileNumber 0 ELSE ISN
  • 使用 Ruby 将 CSV 导出到 Excel 的最简单方法是什么?

    我为此使用 Ruby 1 9 我需要将 Ruby 数组转换为 Excel 电子表格文档 xls 我使用两个 gem 导出为 Excel 可读格式 电子表格 http spreadsheet rubyforge org index html
  • 缓慢变化的维度 - 什么是 Pure type 6 实现

    我试图理解纯类型 6 SCD 实现WIKI http en wikipedia org wiki Slowly changing dimension主要说了三点 如果维度可能发生变化 每个时间片都有一个类型 2 代理键可能会导致问题 纯 T
  • 在 Powershell 中的 Export-Csv 中使用和不使用管道的区别

    这可能更多的是 PowerShell 如何处理变量和管道 而不是一个特定的编程问题 但由于 对我来说 这似乎是奇怪的行为 我想我应该将其发布在这里 我只是在使用 PowerShell 将变量导出到 CSV 时遇到了一些困难 并发现这个堆栈问

随机推荐

  • 如何从我的应用程序打开谷歌日历应用程序?

    我想从我的应用程序打开 Google 日历应用程序 我有以下代码 但它崩溃了 if Utils isPackageInstalled PACKAGENAME getApplicationContext intent new Intent I
  • 是否可以本地化 web.config 文件中的 appSettings 信息?

    我有这样的想法
  • 在 MySQL 查询中创建和桥接表

    我正在为 MySQL 数据库进行基本表设计 该数据库项目是作为一个想法提出的 主要用于教育目的 总共有 11 个表 其中 2 个用于桥接目的 我尝试正确设置主键和外键 我不知道如何编写将创建 11 个表并同时桥接所有表的查询 HERE我附上
  • 节目统计工具

    有没有一个工具能够解析我的源代码 fortran C 或 C 并返回统计信息 例如循环数 平均循环大小 函数数 函数调用数 数量 大小和数组 变量等的类型 类似的东西this在我的架构上运行起来并不容易 神奇的谷歌术语是 代码指标 维基百科
  • 从 C# 中的字符串中删除后跟空格或空格之前的单词或字符

    我有一根绳子 string name AL QADEER UR AL REHMAN AL KHALIL UN 我如何删除所有字符AL UR UN或者可能还有更多类似的事情 我的字符串应该是这样的 卡迪尔 雷赫曼 哈利勒 目前我正在尝试这样做
  • Java 中的接口如何工作?

    我正在自学 Java 并且我被困在有关接口的一章中 我根本无法理解它们在 Java 中是如何工作的 我相信我完全理解界面的含义以及它们如何应用于日常情况和技术 但当涉及到 Java 时 无论是代码方面还是逻辑方面 我都陷入了困境 我不明白
  • Swing - 根据单元格的值设置单元格的颜色

    我想根据单元格的值设置单元格的颜色 在谷歌搜索了一下后 我发现我可以使用这样的东西来做到这一点 public class TableCellRenderer extends DefaultTableCellRenderer Override
  • 是否有用于构建在浏览器中运行的桌面应用程序的开源框架? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我有兴趣启动一个开源项目 该项目可以打包为非技术最终用户的桌面应用程序 但可以在浏览器中运行 一个现有模型是谷歌精炼 我正在寻找一个现有的开源框架这
  • 可以用innerHTML插入脚本吗?

    我尝试使用以下命令将一些脚本加载到页面中innerHTML on a div 该脚本似乎已加载到 DOM 中 但从未执行过 至少在 Firefox 和 Chrome 中 有没有办法让脚本在插入时执行innerHTML 示例代码 Should
  • 空手道 - 如何导入 json 数据

    我想将一些 JSON 数据导入到我的测试中 为了记录我应该这样做 def data read classpath init data json 我已经使用以下内容创建了 JSON 文件 name ehsan 这是我的代码 Backgroun
  • 在 DirectShow 中预览相机并捕获静态图像 - 在 VB.net 中

    我正在尝试在 Visual Studio 2008 中编写一个程序 该程序将访问网络摄像头 在屏幕上显示预览 然后在按下按钮时保存静态快照 jpg 稍后我将把它与数据库集成 但我不应该对那部分有问题 经过一些研究后 看起来 DirectSh
  • 正则表达式从代码中删除方法

    使用正则表达式 我尝试从以下代码中删除所有方法 函数 不考虑 全球范围 但是 我无法使其与方法的所有内部内容匹配
  • 请求多个 API 并在 SQLITE 上存储多个表的最佳方式

    问题是 如何在sqlite上存储 我的意思是如何在 2 个表上存储 2 个 API 数据 我有多个 API 来获取和存储缓存中的数据 目前 我一项一项地做 如下所示 按下按钮 await HelperDatabase1 storeRegis
  • 在 App Engine 上设置 Memcached 以进行 Django 会话缓存

    当设置 Django 使用 Memcached 进行缓存时 在我的例子中 我想使用会话缓存 settings py we set CACHES default BACKEND django core cache backends memca
  • Swift:数组排序未正确完成

    我用它来对 Swift 数组中的组件进行排序 myArray myArray sorted 0 localizedCaseInsensitiveCompare 1 NSComparisonResult OrderedAscending 但是
  • 如何在 x86_64 上的前 4GB 内“malloc”

    平台 Mac OS X郎 Obj C C 是否有可能以某种方式使 malloc 在进程地址空间的前 4GB 内分配内存 我正在模拟 i386 堆栈 需要保证地址位于允许的 32 位范围内 使用 mmap MAP FIXED 需要在任何 ma
  • 如何在 Verilog 中定义带参数的模块?

    我想定义一个add有一个参数的模块 但我对新实例的声明进展不顺利 我想定义这个模块的一个实例 module add parameter wd 1 input wire wd 1 0 a b output wire wd 1 0 o assi
  • 将自定义对象的 ArrayList 写入文件

    我有一个 ArrayList 其中包含自定义服务对象 我想将整个 ArrayList 写入一个文件 然后能够读取它 我尝试了 Gson 但它给了我一个 IllegalStateException Expected BEGIN ARRAY b
  • 将可见性绑定到 DataContext

    我有一个值转换器 可以将 null 转换为 Visibility Collapsed 现在我尝试在用户控件中使用它 以便当 DateContext 为 null 时整个控件会崩溃 该控件如下所示
  • 对多个列使用 CROSS APPLY

    使用 SQL Server 第 3 天 我正在尝试将 2 列分隔数据合并为表值函数的一个输出 这是我的数据 我希望处理数据并将其放入以下格式的表中 我目前trying使用这个 CROSS APPLY SQL 语句 但我不知道我在做什么 US