Sql 将数据从4列压缩到2列

Sql 将数据从4列压缩到2列,sql,sql-server,Sql,Sql Server,我试图在SQL中将两组列合并为一组,其中所有的列都有一个共同的JobID和Date 我想把FrOpr和BkOpr列压缩成一个Opr字段,同时把它们对应的FrExtract和BKETRACT字段压缩成一个对应的Extract字段 你有什么想法吗 非常感谢所有的回复。我修改了下面的一个查询,并使用它创建了一列数据,我希望在更大的查询中引用和提取这些数据 输出给我两列,一个Opr列和一个Extract列。在更大的查询中,我希望只从新的Extract列中选择值,然后将它们汇总为完整的输出。我的问题是知道

我试图在SQL中将两组列合并为一组,其中所有的列都有一个共同的JobID和Date

我想把FrOpr和BkOpr列压缩成一个Opr字段,同时把它们对应的FrExtract和BKETRACT字段压缩成一个对应的Extract字段

你有什么想法吗


非常感谢所有的回复。我修改了下面的一个查询,并使用它创建了一列数据,我希望在更大的查询中引用和提取这些数据

输出给我两列,一个Opr列和一个Extract列。在更大的查询中,我希望只从新的Extract列中选择值,然后将它们汇总为完整的输出。我的问题是知道在何处/如何将其拼接/嵌套到现有查询中。有没有想过如何在不创建临时表的情况下实现这一点?我将发布我想添加到的更大的查询

选择CONCATOperators.OprExtID、'CIREG'作为处理器、ConvertVARCHAR8、Data.StartDateTime、112作为[处理日期]、CONCAT'DEPTRI、Machines.EquipmentType、JobTypeDesc、Jobs.JobName作为[活动类型]、SUMData.Handled作为从dbo.Operators、dbo.datadatadatainput、dbo.Jobs作业、dbo.Machines完成的操作,带有nolock的dbo.JobTypes,其中Jobs.ID=Data.JobID和Data.FrOpr=Operators.Operator和Data.MachNo=Machines.MachNo和Data.JobTypeID=JobTypes.JobTypeID


处理器处理日期活动类型完成0023390\u CIREG 20190116 DEPTRI\u LWACS\u提取\u UTGENERAL 43.61 0023390\u CIREG 20190116 DEPTRI\u MWACS\u DOC PREP\u AGGEN 7.76 0023390\u CIREG 20190116 DEPTRI\u SWACS\u Open\u UTGENERAL 808–

欢迎来到堆栈溢出!今后,请以文本形式提供样本数据和所需结果

这是一个非常简单的联合国支点,我会使用工会:

Select 
    JobId
    , Date
    , FrOpr as Opr
    , FrExtract as Extract
    , 'Fr' as Source_Column_Set
From <table_name>
Where <whatever conditions your application requires>

Union

Select 
    JobId
    , Date
    , BkOpr as Opr
    , BkExtract as Extract
    , 'Bk' as Source_Column_Set
From <table_name>
Where <whatever conditions your application requires>
你可以做一个CTE,然后按照你喜欢的方式对结果进行排序

p、 s.I包含源列以避免数据丢失。

一个选项是交叉应用

范例

使用联合体


显示行所代表内容的源列集合是一个好主意。尽管如此,它应该是联合的,因为我们不希望DBMS寻找并消除重复项。当然,还必须添加FROM条款。和WHERE子句省略空值。公平点,Thorsten,尽管联合在这里起作用,因为提供的示例数据没有重复项。我想我昨天添加了From和Where子句-我一定是忘记保存编辑。是的,UNION有效。只是,为什么要给DBMS额外的工作呢?当我们知道没有复制品时,为什么还要找它呢?谢谢大家的帮助!我最初粘贴在表中,但预览时没有显示与列标题正确对齐的数据;我认为粘贴进去会让人困惑。尽管如此,所有这些解释确实有所帮助!好的,直截了当的回答。尽管如此,我还是会使用UNION。我看不出有什么理由用联合[独特]来代替。谢谢你的帮助!我对SQL还很熟悉,所以这肯定会有帮助。@Amyers Np。如果这对您有帮助,您可以接受此答案。感谢您使用交叉应用选项进行响应。我不知道这个或联盟作为选项存在。所有的回应都非常感谢。我修改了下面的一个查询,并使用它创建了一列数据,我想在一个更大的查询中引用和提取这些数据。将示例数据和示例代码放在问题本身中,而不是放在注释中。
Select A.JobID
      ,A.Date
      ,B.*
 From  YourTable A
 Cross Apply ( values (FrOpr,FrExtract)
                     ,(BkOpr,BKExtract)
             ) B(Opr,Extract)
SELECT JobId , Date , FrOpr AS Opr , FrExtract AS Extract
FROM< TableName>
WHERE FrOpr IS NOT NULL
UNION ALL
SELECT JobId , Date , BkOpr AS Opr , BkExtract AS Extract
FROM <TableName>
WHERE BkOpr IS NOT NULL