将 /转置列转换为行,仅显示修改的值

发布于 2025-02-03 17:48:33 字数 1234 浏览 1 评论 0原文

我有一张名为“ at_order_info”的表名称名称和值,如下所示: -

IDOrdernoordertypeEngineername评论设施部门
101OD 15TomFittingC1P1组件
102OD 15JackRedC1P1绘画

我想显示数据更改,我想显示数据更改2个记录。

需要一个SQL查询,该查询将返回以下输出: -

属性OldValueNewValue
ID101101
EngineernametomJack
评论拟合红色
部门组装绘画

要求: -

  1. 输出应仅显示两个行中价值变化的列。 就像我的情况下一样(orderno,ordertype,设施)列在两个行中都有相同的值,因此在输出中不需要它。 (ID,Engineername,评论,部门)具有不同的值,因此需要它们在输出中。

  2. 现有列名称应像我们看到的那样成为行值(ID,Engineername,评论,部门)。

  3. 输出查询应该有3个自定义列名称,例如属性,旧版,newValue。

    属性 - 包含列名。

    oldValue-相应列的值id = 101。

    newValue-相应列的值ID = 102。

基本上,我想显示2个记录之间发生的数据更改。

I have a table named "AT_ORDER_INFO" with columns names and values as shown below :-

IDOrderNoOrderTypeEngineerNameCommentsFacilityDepartment
101OD 15TomFittingC1P1Assembly
102OD 15JackRedC1P1Painting

I want to display the data changes occurred between 2 records.

Need an SQL Query which will return the below output :-

PropertyOldValueNewValue
ID101102
EngineerNameTomJack
CommentsFittingRed
DepartmentAssemblyPainting

Requirements :-

  1. Output should display only the columns for which there is change in value in both the rows.
    Like in my case (OrderNo,OrderType,Facility) columns have same values in both the rows so dont need this in output. (ID,EngineerName,Comments,Department) have different values so need them in output.

  2. Existing Columns names should become the Row Values like we see (ID,EngineerName,Comments,Department).

  3. Output Query Should Have 3 Custom Columns names like Property, OldValue, NewValue.

    Property - Contains the Column Names.

    OldValue - Value of corresponding columns value of ID = 101.

    NewValue - Value of corresponding columns value of ID = 102.

Basically, I want to display the data changes occurred between 2 records.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

来世叙缘 2025-02-10 17:48:33

您的数据

CREATE TABLE AT_ORDER_INFO(
   ID          VARCHAR(50)  NOT NULL 
  ,OrderNo      VARCHAR(50) NOT NULL
  ,OrderType    INTEGER  NOT NULL
  ,EngineerName VARCHAR(50) NOT NULL
  ,Comments     VARCHAR(50) NOT NULL
  ,Facility     VARCHAR(50) NOT NULL
  ,Department   VARCHAR(50) NOT NULL
);
INSERT INTO AT_ORDER_INFO
(ID,OrderNo,OrderType,EngineerName,Comments,Facility,Department) VALUES 
(101,'OD 1',5,'Tom','Fitting','C1P1','Assembly'),
(102,'OD 1',5,'Jack','Red','C1P1','Painting');

首先应在组中使用String_agg在中使用,以确保订单

101 => Old ID
102 => New ID
select 
string_agg(ID,',') WITHIN GROUP (ORDER BY ID) ID,
string_agg(EngineerName,',') WITHIN GROUP (ORDER BY ID) EngineerName,
string_agg(Comments,',') WITHIN GROUP (ORDER BY ID) Comments,
string_agg(Department,',') WITHIN GROUP (ORDER BY ID) Department
from AT_ORDER_INFO
IDEngineername评论部门
101,102Tom,JackFitting,RedAssembly,painting,

然后您应该在subquery 和undivot

  select 
  indicatorname as Property,
  indicatorvalue
from (select 
string_agg(ID,',') WITHIN GROUP (ORDER BY ID)  ID,
string_agg(EngineerName,',') WITHIN GROUP (ORDER BY ID) EngineerName,
string_agg(Comments,',') WITHIN GROUP (ORDER BY ID) Comments,
string_agg(Department,',') WITHIN GROUP (ORDER BY ID) Department
from AT_ORDER_INFO) AOI
unpivot
(
  indicatorvalue
  for indicatorname in ([ID]
      ,[EngineerName]
      ,[Comments]
      ,[Department])
) unpiv;

属性指示器
ID101,102
eNgiremnametom,jack
评论拟合,红色
部门汇编,绘画

下一步是使用拆分列的方法,我使用了substring
如果值更多地考虑创建一个fucntion,将字符串分为列,则可以通过处理动态ID。

select 
indicatorname as  Property,
Substring(indicatorvalue, 1,Charindex(',', indicatorvalue)-1) as 'oldvalue',
Substring(indicatorvalue, Charindex(',', indicatorvalue)+1, LEN(indicatorvalue)) as  'newvalue'
from (select 
string_agg(ID,',') WITHIN GROUP (ORDER BY ID)  ID,
string_agg(EngineerName,',') WITHIN GROUP (ORDER BY ID) EngineerName,
string_agg(Comments,',') WITHIN GROUP (ORDER BY ID) Comments,
string_agg(Department,',') WITHIN GROUP (ORDER BY ID) Department
from AT_ORDER_INFO) m
unpivot
(
  indicatorvalue
  for indicatorname in ([ID]
      ,[EngineerName]
      ,[Comments]
      ,[Department])
) unpiv;

Propertyoldvaluenewvalue
ID101102
EngineerNameTomJack
CommentsFittingRed
DepartmentAssemblyPainting

dbfiddle

your data

CREATE TABLE AT_ORDER_INFO(
   ID          VARCHAR(50)  NOT NULL 
  ,OrderNo      VARCHAR(50) NOT NULL
  ,OrderType    INTEGER  NOT NULL
  ,EngineerName VARCHAR(50) NOT NULL
  ,Comments     VARCHAR(50) NOT NULL
  ,Facility     VARCHAR(50) NOT NULL
  ,Department   VARCHAR(50) NOT NULL
);
INSERT INTO AT_ORDER_INFO
(ID,OrderNo,OrderType,EngineerName,Comments,Facility,Department) VALUES 
(101,'OD 1',5,'Tom','Fitting','C1P1','Assembly'),
(102,'OD 1',5,'Jack','Red','C1P1','Painting');

first you should use String_agg WITH WITHIN GROUP to ensure the order

101 => Old ID
102 => New ID
select 
string_agg(ID,',') WITHIN GROUP (ORDER BY ID) ID,
string_agg(EngineerName,',') WITHIN GROUP (ORDER BY ID) EngineerName,
string_agg(Comments,',') WITHIN GROUP (ORDER BY ID) Comments,
string_agg(Department,',') WITHIN GROUP (ORDER BY ID) Department
from AT_ORDER_INFO
IDEngineerNameCommentsDepartment
101,102Tom,JackFitting,RedAssembly,Painting

Then you should use this in Subquery and Unpivot

  select 
  indicatorname as Property,
  indicatorvalue
from (select 
string_agg(ID,',') WITHIN GROUP (ORDER BY ID)  ID,
string_agg(EngineerName,',') WITHIN GROUP (ORDER BY ID) EngineerName,
string_agg(Comments,',') WITHIN GROUP (ORDER BY ID) Comments,
string_agg(Department,',') WITHIN GROUP (ORDER BY ID) Department
from AT_ORDER_INFO) AOI
unpivot
(
  indicatorvalue
  for indicatorname in ([ID]
      ,[EngineerName]
      ,[Comments]
      ,[Department])
) unpiv;

Propertyindicatorvalue
ID101,102
EngineerNameTom,Jack
CommentsFitting,Red
DepartmentAssembly,Painting

The next step is using methods of splitting column, I have used Substring
if values are much more consider creating a fucntion that split string into columns, by doing so it is possible to handle Dynamic IDs.

select 
indicatorname as  Property,
Substring(indicatorvalue, 1,Charindex(',', indicatorvalue)-1) as 'oldvalue',
Substring(indicatorvalue, Charindex(',', indicatorvalue)+1, LEN(indicatorvalue)) as  'newvalue'
from (select 
string_agg(ID,',') WITHIN GROUP (ORDER BY ID)  ID,
string_agg(EngineerName,',') WITHIN GROUP (ORDER BY ID) EngineerName,
string_agg(Comments,',') WITHIN GROUP (ORDER BY ID) Comments,
string_agg(Department,',') WITHIN GROUP (ORDER BY ID) Department
from AT_ORDER_INFO) m
unpivot
(
  indicatorvalue
  for indicatorname in ([ID]
      ,[EngineerName]
      ,[Comments]
      ,[Department])
) unpiv;

Propertyoldvaluenewvalue
ID101102
EngineerNameTomJack
CommentsFittingRed
DepartmentAssemblyPainting

dbfiddle

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文