繁体   English   中英

将多行合并为一行

[英]Combining multiple rows into one single row

我有一个这样的表结构: so_1.png

我需要获取每列的最新值!= NULL。 我当前的方法是使用像这样的UNION语句:

SELECT TOP 1 testlong1_min, testlong1_max, NULL, NULL, NULL, NULL, NULL, NULL FROM Grenzwerte WHERE testlong1_min IS NOT NULL AND testlong1_max IS NOT NULL UNION 
SELECT TOP 1 NULL, NULL, testlong2_min, testlong2_max, NULL, NULL, NULL, NULL FROM Grenzwerte WHERE testlong2_min IS NOT NULL AND testlong2_max IS NOT NULL UNION 
SELECT TOP 1 NULL, NULL, NULL, NULL, testlong3_min, testlong3_max, NULL, NULL FROM Grenzwerte WHERE testlong3_min IS NOT NULL AND testlong3_max IS NOT NULL UNION 
SELECT TOP 1 NULL, NULL, NULL, NULL, NULL, NULL, testlong4_min, testlong4_max FROM Grenzwerte WHERE testlong4_min IS NOT NULL AND testlong4_max IS NOT NULL 

这似乎不起作用,我的结果是空的。 我还考虑过对每个字段执行1个查询,但是与UNION语句相比,我认为这会产生太多开销。

题:

有没有办法浓缩列并在一行中返回最新值?

编辑

使用Parodo的建议,我现在得到了这个结果,现在我需要将行合并为一个。

在此处输入图片说明

您应该使用is not null而不是<> NULL ,如下所示

SELECT TOP 1 testlong1_min, testlong1_max, NULL, NULL, NULL, NULL, NULL, NULL FROM Grenzwerte WHERE testlong1_min IS NOT NULL AND testlong1_max IS NOT NULL 
UNION 
SELECT TOP 1 testlong1_min, testlong1_max, NULL, NULL, NULL, NULL, NULL, NULL FROM Grenzwerte WHERE testlong1_min IS NOT NULL AND testlong1_max IS NOT NULL 
UNION 
SELECT TOP 1 NULL, NULL, testlong2_min, testlong2_max, NULL, NULL, NULL, NULL FROM Grenzwerte WHERE testlong2_min IS NOT NULL AND testlong2_max IS NOT NULL 
UNION 
SELECT TOP 1 NULL, NULL, NULL, NULL, testlong3_min, testlong3_max, NULL, NULL FROM Grenzwerte WHERE testlong3_min IS NOT NULL AND testlong3_max IS NOT NULL 
UNION 
SELECT TOP 1 NULL, NULL, NULL, NULL, NULL, NULL, testlong4_min, testlong4_max FROM Grenzwerte WHERE testlong4_min IS NOT NULL AND testlong4_max IS NOT NULL 

使用UNION要小心,因为它会避免重复。 如果要查看重复项,请改用UNION ALL

在下面的语句中,每个CTE仅具有所有各自的非null对,并且还将获得一个行号,其中最新ID的编号为1。因此,我仅基于每个CTE的行号获得最新的ID,因此每个只有一排。 这样,CROSS JOINING将导致单行具有所需的结果。

;WITH testLong1CTE AS
(
    SELECT testlong1_min, testlong1_max, ROW_NUMBER()OVER(ORDER BY ID DESC) AS rn
    FROM   Table
    WHERE  testlong1_min IS NOT NULL AND testlong1_max IS NOT NULL
),testLong2CTE AS
(
    SELECT testlong2_min, testlong2_max, ROW_NUMBER()OVER(ORDER BY ID DESC) AS rn
    FROM   Table
    WHERE  testlong2_min IS NOT NULL AND testlong2_max IS NOT NULL
),testLong3CTE AS
(
    SELECT testlong3_min, testlong3_max, ROW_NUMBER()OVER(ORDER BY ID DESC) AS rn
    FROM   Table
    WHERE  testlong3_min IS NOT NULL AND testlong3_max IS NOT NULL
),testLong4CTE AS
(
    SELECT testlong4_min, testlong4_max, ROW_NUMBER()OVER(ORDER BY ID DESC) AS rn
    FROM   Table
    WHERE  testlong4_min IS NOT NULL AND testlong4_max IS NOT NULL
)
SELECT testlong1_min, 
       testlong1_max,
       testlong2_min, 
       testlong2_max,
       testlong3_min, 
       testlong3_max,
       testlong4_min, 
       testlong4_max
FROM (SELECT testlong1_min, testlong1_max FROM testLong1CTE WHERE rn = 1) AS T1
CROSS JOIN (SELECT testlong2_min, testlong2_max FROM testLong2CTE WHERE rn = 1) AS T2
CROSS JOIN (SELECT testlong3_min, testlong3_max FROM testLong3CTE WHERE rn = 1) AS T3
CROSS JOIN (SELECT testlong4_min, testlong4_max FROM testLong4CTE WHERE rn = 1) AS T4

当您使用UNION运算符合并两个查询时,结果集是两个查询串联而成的唯一行,这不是您想要的。 如果您希望每一行的每一列都具有最新的非空值,则应首先获取最新的非空值,然后将每一列都连接到结果中。

; WITH
tab1 AS (
   SELECT TOP 1 testlong1_min, testlong1_max
   FROM Grenzwerte
   WHERE testlong1_min IS NOT NULL
   ORDER BY [mySequenceColumn]
),
tab2 AS (
   SELECT TOP 1 testlong2_min, testlong2_max
   FROM Grenzwerte
   WHERE testlong2_min IS NOT NULL
   ORDER BY [mySequenceColumn]
),
tab3 AS (
   SELECT TOP 1 testlong3_min, testlong3_max
   FROM Grenzwerte
   WHERE testlong3_min IS NOT NULL
   ORDER BY [mySequenceColumn]
),
tab4 AS (
   SELECT TOP 1 testlong4_min, testlong4_max
   FROM Grenzwerte
   WHERE testlong4_min IS NOT NULL
   ORDER BY [mySequenceColumn]
),
SELECT *
FROM tab1 CROSS JOIN tab2 CROSS JOIN tab3 CROSS JOIN tab4;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM