【问题标题】:Select info from row to another row从一行选择信息到另一行
【发布时间】:2021-03-23 19:55:39
【问题描述】:

我在视图上有这个选择:

SELECT
    T1.ID AS [ID],
    T1.A AS [A],
    T1.B AS [B],
    T4.C AS [C],
    ISNULL(NULLIF(T3.D, ''), T2.D) AS [D],
    T1.E AS [E],
    T1.F AS [F],
    T1.G AS [G]
FROM T1
INNER JOIN T2 ON T2.X = T1.X
INNER JOIN T3 ON T3.Y = T2.Y
RIGHT JOIN T4 ON T4.Z = T3.Z

然后得到这个:

║  ID  ║  A   ║  B   ║  C   ║  D   ║  E   ║  F   ║  G   ║  
╠══════╬══════╬══════╬══════╬══════╬══════╬══════╬══════╬
║ 1    ║ 3    ║ 4    ║ 1000 ║ X    ║ 1    ║ 1    ║ 1    ║ 
║ 1    ║ 3    ║ 4    ║ 2000 ║ Y    ║ 1    ║ 1    ║ 1    ║ 
║ NULL ║ NULL ║ NULL ║ 3000 ║ NULL ║ NULL ║ NULL ║ NULL ║ 

我希望最后一行是这样的:

║ 1 ║ 3 ║ 4 ║ 3000 ║ Z ║ 1 ║ 1 ║ 1 ║

也就是说,除了“C”列和“D”列之外,所有列的值都等于其他行。 D列的值是从T2.D得到的

我该怎么办?谢谢。

【问题讨论】:

  • 您需要进一步解释如何获取额外行的数据...例如Z从哪里来?

标签: sql sql-server join select view


【解决方案1】:

如果没有使用任何示例数据,我建议lag() 可能在这种确切的场景中使用,例如

select
    IsNull(T1.ID, Lag(T1.ID) over(order by T4.C)) as [ID],
    IsNull(T1.A, Lag(T1.A) over(order by T4.C))) as [A],
    IsNull(T1.B, Lag(T1.B) over(order by T4.C))) as [B],
    T4.C as [C],
    IsNull(NullIf(T3.D, ''), T2.D) as [D],
    IsNull(T1.E, Lag(T1.E) over(order by T4.C))) as [E],
    IsNull(T1.F, Lag(T1.F) over(order by T4.C))) as [F],
    IsNull(T1.G, Lag(T1.G) over(order by T4.C))) as [G],
from T1
inner join T2 on T2.X = T1.X
inner join T3 on T3.Y = T2.Y
right join T4 on T4.Z = T3.Z

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多