gpt4 book ai didi

sql - 使用交叉应用将列转置为行

转载 作者:行者123 更新时间:2023-12-02 02:45:52 24 4
gpt4 key购买 nike

源数据

+--------+-------+---------------+------------+--------+--------------+-------+
| RowNum | SeqNo | Name | NameReason | Gender | GenderReason | ID |
+--------+-------+---------------+------------+--------+--------------+-------+
| 1 | A123 | IronMan | | P | | E8888 |
| 2 | A123 | CaptainMarvel | A | L | A | E8888 |
| 3 | A123 | Yoooo | | | | E8888 |
| 4 | A123 | Heyyy | | | | E8888 |
| 1 | B456 | Hey | | | | D2222 |
| 2 | B456 | DOTS | A | | | D2222 |
| 1 | C1234 | Hulk | | | | E8989 |
| 2 | C1234 | Cap | | | | E8989 |
| 3 | C1234 | Hat | | | | E8989 |
+--------+-------+---------------+------------+--------+--------------+-------+

我想要的结果

+-------+-------+---------+---------------+----------+--------+
| SeqNo | ID | ColName | From_Value | To_Value | Reason |
+-------+-------+---------+---------------+----------+--------+
| A123 | E8888 | Name | CaptainMarvel | IronMan | A |
| A123 | E8888 | Gender | L | P | A |
| B456 | D2222 | Name | DOTS | Hey | A |
| C1234 | E8989 | Name | Cap | Hulk | |
+-------+-------+---------+---------------+----------+--------+

查询:

select a.rownum, a.seqno, a.name, a.id,
b.*
from #A a cross apply
( values ('Name', NameReason)
('Gender', GenderReason)
) b (colname, Reason)
where reason is not null

注:要查找变化。 RowNum=1 是最新更新 (To_Value),RowNum=2 (From_Value)。 rownum 已经过滤了顶部更新的结果 (rownumber() over (partitition)我只需要 rownum=2(from_Value), rownum=1(to_value) 其他忽略,因为1 个应用程序可以更新 100 次,我只需要找到最新的更改即可。

从上面的查询中,如何修改为我想要的结果?我如何添加 from_value 和 to_value,原因?

最佳答案

假设您可以在 RowNum + 1 上链接“From”记录

SELECT q.SeqNo, q.ToName AS Name, q.ID, ca.ColName, ca.From_Value, ca.To_Value 
FROM
(
SELECT
a1.ID, a1.SeqNo, a1.NameReason, a1.GenderReason, a1.RowNum,
a2.Name as FromName, a1.Name as ToName,
a2.Gender AS FromGender, a1.Gender AS ToGender
FROM #A a1
JOIN #A a2 ON (a2.ID = a1.ID AND a2.RowNum = a1.RowNum + 1)
WHERE (a1.NameReason IS NOT NULL OR a1.GenderReason IS NOT NULL)
AND a1.Name != a2.Name
) q
CROSS APPLY (VALUES
(1, 'Name', NameReason, FromName, ToName),
(2, 'Gender', GenderReason, FromGender, ToGender)
) ca (ColSeq, ColName, Reason, From_Value, To_Value)
WHERE ca.Reason IS NOT NULL
ORDER BY q.SeqNo, ca.ColSeq;

但根据评论,只有 RowNum 1 和 2 很重要。
然后就可以简化了。

SELECT q.SeqNo, q.ToName AS Name, q.ID, ca.ColName, ca.From_Value, ca.To_Value 
FROM
(
SELECT
a1.ID, a1.SeqNo,
a1.NameReason, a2.Name as FromName, a1.Name as ToName,
a1.GenderReason, a2.Gender AS FromGender, a1.Gender AS ToGender
FROM #A a1
JOIN #A a2 ON (a2.ID = a1.ID AND a2.RowNum = 2)
WHERE a1.RowNum = 1
) q
CROSS APPLY (VALUES
(1, 'Name', NameReason, FromName, ToName),
(2, 'Gender', GenderReason, FromGender, ToGender)
) ca (ColSeq, ColName, Reason, From_Value, To_Value)
WHERE ca.Reason IS NOT NULL
ORDER BY q.SeqNo, ca.ColSeq;

结果:

SeqNo Name    ID    ColName From_Value    To_Value
----- ------- ----- ------- ------------- --------
A123 IronMan E8888 Name CaptainMarvel IronMan
A123 IronMan E8888 Gender L P
B456 Hey D2222 Name DOTS Hey

db<>fiddle here 测试

关于sql - 使用交叉应用将列转置为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55101003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com