Доступ к другим данным столбца таблицы дает нулевой результат - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть несколько таблиц, и 1 из них является основной таблицей, в которой содержатся все необработанные данные:

enter image description here

Это результат после выполнения CTE4.

CTE4 AS 
(
    SELECT 
        roadname,
        SUM(CASE WHEN roadCrossSection1 IS NOT NULL THEN roadLength END) AS roadLength,
        ISNULL(AVG(CASE WHEN elevationDifference <= 0 THEN elevationDifference END),0) AS eglAvgDepth,
        ISNULL(AVG(CASE WHEN elevationDifference > 0 THEN elevationDifference END),0) AS pglAvgDepth,
        ISNULL(SUM(CASE WHEN elevationDifference <= 0 THEN roadLength END),0) AS eglLength,
        ISNULL(SUM(CASE WHEN elevationDifference > 0 THEN roadLength END),0) AS pglLength,
        MAX(roadCrossSection1) roadCrossSection1
    FROM 
        CTE3
    GROUP BY 
        roadName
)
-----final view
SELECT *
FROM CTE4
ORDER BY roadName

Как только я добавляю другой CTE (CTE5), это привело к неожиданному результату.

enter image description here

Это таблица dbo.roadCrossSection:

enter image description here

После запуска этого сценария я ожидаю, что roadCrossSection1 type2A будет равен CW1 = 6

CTE5 AS (
SELECT roadName,roadLength,
IIF(C.roadCrossSection1=R.crossSection,R.CW,0) as CW1

FROM CTE4 AS C LEFT JOIN dbo.roadCrossSection AS R
ON C.roadName=R.crossSection
)


SELECT *
FROM CTE5
ORDER BY roadName

Как это исправить?

1 Ответ

0 голосов
/ 25 февраля 2020

Если мы сконцентрируемся на одной строке из вашего выхода CTE4:

Roadname    RoadLength  eglAvgtDepth    pglAvgDepth     eglLength   pglLength   roadCrossSection1
p3-AL-2137  103.997     -0.202500       0.170000        60.996      43.001      2A

, то посмотрим на ваше объединение в CTE5:

CTE5 AS (
SELECT roadName,roadLength,
IIF(C.roadCrossSection1=R.crossSection,R.CW,0) as CW1

FROM CTE4 AS C LEFT JOIN dbo.roadCrossSection AS R
ON C.roadName=R.crossSection  -- <-- THIS JOIN HERE!!!
)

Итак, вы ищете строку в dbo.roadCrossSection, где значение для crossSection равно p3-AL-2137 (название дороги из CTE4).

На основе опубликованного вами снимка экрана теперь есть строки в dbo.roadCrossSection, где crossSection = 'p3-AL-2137', поэтому запись не выполняется возвращается из dbo.roadCrossSection.

Однако в таблице есть строка, в которой значение равно 2A, что соответствует столбцу roadCrossSection1, а не столбцу roadName. Если вы измените свое объединение на следующее, то должны быть возвращены строки:

    ON C.roadCrossSection1=R.crossSection  

Как только ваше объединение будет правильным, ваше выражение IIF станет избыточным и может быть заменено на ISNULL:

CTE5 AS (
SELECT roadName,roadLength, ISNULL(R.CW,0) as CW1
FROM CTE4 AS C LEFT JOIN dbo.roadCrossSection AS R
    ON C.roadCrossSection1=R.crossSection  
)
SELECT *
FROM CTE5
ORDER BY roadName;
...