将数据从4列浓缩到2列

时间:2019-01-24 22:07:47

标签: sql sql-server

我正在尝试将两组列组合成SQL中的一组,其中所有组都具有相同的JobID和Date。

我想将FrOpr和BkOpr列压缩为一个Opr字段,同时将它们对应的FrExtract和BkExtract字段压缩为一个对应的Extract字段。

Before and After Picture

关于如何执行此操作的任何想法?

非常感谢所有回复。我修改了以下查询之一,并用它来创建一列数据,我希望在更大的查询中引用并从中提取数据。

输出为我提供了两列,即Opr和Extract列。在较大的查询中,我希望仅从新的“提取”列中选择值,然后将其求和为“已完成”输出。我的问题是知道在哪里/如何将其拼接/嵌套到现有查询中。关于如何在不创建临时表的情况下执行此操作的任何想法?我将发布更大的查询,并将其添加到

选择CONCAT(Operators.OprExtID,'CIREG')AS处理器,Convert(VARCHAR(8),Data.StartDateTime,112)AS [处理日期],CONCAT('DEPTRI',Machines.EquipmentType,'',JobTypes .JobTypeDesc,'',Jobs.JobName)AS [活动类型],SUM(Data.Handled)AS由dbo.Operators,dbo.Data DataInput,dbo.jobs作业,dbo.Machines,dbo.JobTypes WITH(nolock)完成在哪里(Jobs.ID = Data.JobID AND Data.FrOpr = Operators.Operator AND Data.MachNo = Machines.MachNo AND Data.JobTypeID = JobTypes.JobTypeID)

已完成处理器处理的日期活动类型0023390_CIREG 20190116 DEPTRI_LWACS_EXTRACTION_UTGENERAL 43.61 0023390_CIREG 20190116DEPTRI_MWACS_DOC PREP_AGGEN 7.76 0023390_CIREG 20190116 DEPTRI_SWACS_OPENING_UTGENERAL 808 –

3 个答案:

答案 0 :(得分:2)

使用DB

UNION

答案 1 :(得分:1)

欢迎堆栈溢出!将来,请以文本形式提供示例数据和所需结果。

这是一个非常简单的unpivot,我将使用Union:

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。我加入了Source_Column_Set以避免数据丢失。

答案 2 :(得分:1)

一个选项是CROSS APPLY

示例

Select A.JobID
      ,A.Date
      ,B.*
 From  YourTable A
 Cross Apply ( values (FrOpr,FrExtract)
                     ,(BkOpr,BKExtract)
             ) B(Opr,Extract)