Определить недостающие строки и вычислить их в SQL - PullRequest
0 голосов
/ 23 мая 2019

У меня есть следующие данные. Необходимо выявить пропущенные строки и рассчитать среднее значение

LineNo Поле1 Поле2 Среднее за год
1 & ЕПРС; Франция и EMSP, Париж и EMSP; 2019 & EMSP; 100 & EMSP;
2 & ЕПРС; Франция и EMSP, Париж и EMSP; 2017 & EMSP; 300 & EMSP;
3 & ЕПРС; Франция и EMSP; Nice & EMSP; 2018 & EMSP; 200 & EMSP;
4 & ЕПРС; Италия и EMSP; Рим & ЕПРС; 2019 & ЕПРС; 50 & ЕПРС;
5 & ​​ЕПРС; Италия и EMSP; Рим & ЕПРС; 2018 & ЕПРС; 500 & ЕПРС;
6 & ЕПРС; Италия и EMSP; Рим 2017, emsp; 250 & emsp;

Необходимо рассчитать среднее значение за все годы (2019,2018,2017).

Таким образом, для комбинации Франции и Парижа - 2018 год отсутствует.
Так что для Франции и Ниццы - 2019 и 2017 годы отсутствуют. Для комбинации Италии и Рима у нас есть все записи.

Таким образом, для пропущенной комбинации необходимо рассчитать среднее значение, как показано ниже (формула, сумма / 3 во всех случаях, независимо от количества присутствующих лет)

Окончательные данные выглядят как показано ниже.

LineNo Field1 Field2 Год Значение
1 & ЕПРС; Франция и EMSP; Париж и EMSP; 2019 & ЕПРС; 100 & ЕПРС; * * 1 022 2 & ЕПРС; Франция и EMSP; Париж и EMSP; 2017 & ЕПРС; 300 & ЕПРС; * * тысяча двадцать-три 3 & ЕПРС; Франция и EMSP; Nice & EMSP; 2017 & ЕПРС; 200 & ЕПРС;
4 & ЕПРС; Италия и EMSP; Рим & ЕПРС; 2019 & ЕПРС; 50 & ЕПРС;
5 & ​​ЕПРС; Италия и EMSP; Рим & ЕПРС; 2018 & ЕПРС; 500 & ЕПРС; * * тысяча двадцать шесть 6 & ЕПРС; Италия и EMSP; Рим & ЕПРС; 2017 & ЕПРС; 250 & ЕПРС; * +1027 * * 7 & ЕПРС; Франция и EMSP; Париж и EMSP; 2018 & ЕПРС; 133 & ЕПРС; * * тысяча двадцать-восемь * 8 & ЕПРС; Франция и EMSP; Nice & EMSP; 2018 & ЕПРС; 66 & ЕПРС;
* 9 & ЕПРС; Франция и EMSP; Nice & EMSP; 2019 & EMSP; 66 & EMSP;

Строки 7,8,9 - новые

1 Ответ

1 голос
/ 23 мая 2019

Вы можете использовать что-то вроде ниже, чтобы получить пустую строку, и после этого оператор обновления может обновить значения '0' до среднего значения

SELECT DISTINCT
        [year]
 INTO   #allyears
 FROM   #temp
 -- this is to get all the years in a lookup  
 ;WITH   cte_t
          AS ( SELECT   place1 ,
                        place2 ,
                        CASE WHEN a.year = t.year THEN val
                             ELSE 0
                        END AS val ,
                        a.year ,
                        ROW_NUMBER() OVER ( PARTITION BY place1, place2,
                                            a.year ORDER BY CASE
                                                              WHEN a.year = t.year
                                                              THEN val
                                                              ELSE 0
                                                            END DESC ) rn
               FROM     #allyears AS a
                        CROSS JOIN #temp AS t
             )
    SELECT  place1 ,
            place2 ,
            year ,
            val 
    FROM    cte_t 
    WHERE rn = 1 
...