[英]SQL query returning values based on values in the same row
Is there a way to write a query that returns a value from a different row in the same table based on a value in a row and have it return that value on the same row?有没有办法编写一个查询,根据一行中的值从同一表中的不同行返回一个值,并让它在同一行上返回该值?
I have a table with columns SC_CODE
, SC_DESC
, SC_ALT_CODE
, and SC_CANX_CODE
:我有一个包含SC_CODE
、 SC_DESC
、 SC_ALT_CODE
和SC_CANX_CODE
列的表:
SC_CODE
values are 1
, 2
, 901
, 902
, etc. SC_CODE
值为1
、 2
、 901
、 902
等。SC_DESC
values are Test1
, Test2
, Test3
, Test4
, etc. SC_DESC
值为Test1
、 Test2
、 Test3
、 Test4
等。SC_ALT_CODE
values are NULL
, 3
, 4
, NULL
, etc. SC_ALT_CODE
值为NULL
、 3
、 4
、 NULL
等。SC_CANX_CODE
values are 901
, 902
, 903
, 904
, etc. SC_CANX_CODE
值为901
、 902
、 903
、 904
等。My query needs to return something like:我的查询需要返回如下内容:
1, Test1, NULL, 901, Test3
2, Test2, 3, 902, Test4
Here, Test3
is the SC_DESC
of SC_CODE 901
and Test4
is the SC_DESC
of SC_CODE 902
, etc.这里, Test3
是SC_DESC
的SC_CODE 901
和Test4
是SC_DESC
的SC_CODE 902
等
I think this should work for you:我认为这应该适合你:
DECLARE @TEST AS TABLE
(
SC_CODE INT
, SC_DESC VARCHAR(255)
, SC_ALT_CODE INT
, SC_CANX_CODE INT
)
INSERT @TEST (SC_CODE, SC_DESC, SC_ALT_CODE, SC_CANX_CODE)
VALUES (1, 'Test1', NULL, 901)
, (2, 'Test2', 3, 902)
, (901, 'Test3', 4, 903)
, (902, 'Test4', NULL, 904)
, (3, 'Test5', NULL, NULL)
SELECT T.SC_CODE
, T.SC_DESC
, T.SC_ALT_CODE
, T.SC_CANX_CODE
, T2.SC_DESC AS CANX_DESC
, T3.SC_DESC AS ALT_DESC
FROM @TEST AS T
JOIN @TEST AS T2
ON T2.SC_CODE = T.SC_CANX_CODE
LEFT JOIN @TEST AS T3
ON T3.SC_CODE = T.SC_ALT_CODE
Result:结果:
+---------+---------+-------------+--------------+-----------+----------+
| SC_CODE | SC_DESC | SC_ALT_CODE | SC_CANX_CODE | CANX_DESC | ALT_DESC |
+---------+---------+-------------+--------------+-----------+----------+
| 1 | Test1 | NULL | 901 | Test3 | NULL |
| 2 | Test2 | 3 | 902 | Test4 | Test5 |
+---------+---------+-------------+--------------+-----------+----------+
Edit Added a join for SC_ALT_CODE as asked in comment.编辑为 SC_ALT_CODE 添加了一个连接,如评论中所问。 Note I added a row to the sample data to get result.注意我在示例数据中添加了一行以获得结果。 Also note the use of LEFT JOIN
, not every record has an Alternative.还要注意LEFT JOIN
的使用,并不是每条记录都有一个 Alternative。 With LEFT JOIN
you don't loose those records.使用LEFT JOIN
您不会丢失这些记录。
Its still not entirely clear what you are trying to do but I think you are looking for the LEAD function with an offset of 2, to produce the desired result:它仍然不完全清楚您要做什么,但我认为您正在寻找偏移量为 2 的 LEAD 函数,以产生所需的结果:
CREATE TABLE #tbltmp(
SC_CODE int,
SC_DESC varchar(5),
SC_ALT_CODE int,
SC_CANX_CODE int);
INSERT INTO #tbltmp values
(1,'Test1',NULL,901),
(2,'Test2',3,902),
(901,'Test3',4,903),
(902,'Test4',NULL,904);
SELECT
SC_CODE,
SC_DESC,
SC_ALT_CODE,
SC_CANX_CODE,
LEAD(SC_DESC,2) OVER (ORDER BY SC_DESC) SC_DESC
FROM #tbltmp
DROP TABLE #tbltmp
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.