SQL查询根据同一行中的值返回值

时间:2018-02-08 16:42:27

标签: sql sql-server

有没有办法编写一个查询,该查询根据行中的值从同一个表中的不同行返回一个值,并让它在同一行返回该值?

我有一个包含SC_CODESC_DESCSC_ALT_CODESC_CANX_CODE列的表:

  • SC_CODE值为12901902等。
  • SC_DESC值为Test1Test2Test3Test4等。
  • SC_ALT_CODE值为NULL34NULL等。
  • SC_CANX_CODE值为901902903904等。

我的查询需要返回类似的内容:

1, Test1, NULL, 901, Test3
2, Test2, 3, 902, Test4

此处Test3SC_DESC的{​​{1}}而SC_CODE 901Test4的{​​{1}}等。

2 个答案:

答案 0 :(得分:1)

我认为这应该适合你:

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

结果:

+---------+---------+-------------+--------------+-----------+----------+
| 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    |
+---------+---------+-------------+--------------+-----------+----------+

修改 添加了SC_ALT_CODE的连接,如评论中所述。注意我在示例数据中添加了一行以获得结果。另请注意LEFT JOIN的使用,并非每个记录都有替代。使用LEFT JOIN,您不会丢失这些记录。

答案 1 :(得分:0)

它仍然不完全清楚你想要做什么,但我认为你正在寻找偏移量为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