Повторяющиеся строки после функции AVG в SQL - PullRequest
1 голос
/ 23 сентября 2019

В настоящее время у меня возникают проблемы при создании двух столбцов с AVG, сгруппированных по 2 столбцам идентификаторов

Я попробовал приведенный ниже код, чтобы попытаться решить эту проблему.

Мои результаты, я получаю копиютот же ID_STORE бесчисленное время с AVG для каждой строки.Моя цель - создать одну строку для ID_STORE (DISTINCT) и несколько строк для ID_BRICK путем объединения двух AVG.

| ID_BRICK | ID_STORE | AVG1  | AVG2  |
| 00000001 | 0003     | 70.47 | 85.40 |
| 00000001 | 0003     | 61.55 | 85.40 |
| 00000001 | 0003     | 55.33 | 85.40 |

...

| ID_BRICK | ID_STORE | AVG1   | AVG2  |
| 00000001 | 0004     | 80.47  | 85.40 |
| 00000001 | 0004     | 161.55 | 85.40 |
| 00000001 | 0004     | 15.33  | 85.40 |

...

| ID_BRICK | ID_STORE | AVG1   | AVG2  |
| 00000001 | 0005     | 60.47  | 85.40 |
| 00000001 | 0005     | 11.85  | 85.40 |
| 00000001 | 0005     | 19.23  | 85.40 |

Мой запрос

SELECT 
    ID_STORE,
    ID_BRICK,
    AVG1,
    AVG2,
CASE
    WHEN AVG1>=AVG2 THEN 'HIGH TOP3'
    WHEN AVG1<AVG2  THEN 'LOW TOP3'
END AS CLASS_TOP
FROM(
    SELECT
        ID_STORE,
        ID_BRICK,
        AVG(V.PRICE) AS AVG1,
        AVG(V.PRICE) OVER(PARTITION BY L.ID_BRICK) AS AVG2
    FROM CPVBI.dbo.SALES V
        INNER JOIN CPVBI.dbo.STORE L
            ON (L.ID_STORE=V.ID_STORE)
        INNER JOIN CPVBI.dbo.BRAND M
            ON(V.ID_BRAND = M.ID_BRAND)
    WHERE (L.FLAG_STORE = '1' AND M.FLAG_BRAND = 'S') AND ( ID_BRAND = '53112' OR ID_BRAND = '53130' OR ID_BRAND = '53111')
    GROUP BY L.ID_BRICK, L.ID_STORE, V.PRICE
)AS T2
ORDER BY ID_STORE;

Я хотел бы получить результатымой запрос произвести

| ID_BRICK | ID_STORE | AVG1  | AVG2  |
| 00000001 | 0003     | 70.47 | 85.40 |
| 00000001 | 0004     | 65.33 | 85.40 |
| 00000001 | 0005     | 67.33 | 85.40 |


1 Ответ

1 голос
/ 23 сентября 2019

НЕПРОВЕРЕНО Вы сможете получить среднее значение для одного кирпича в подзапросе, а затем добавить его к среднему значению для магазина:

SELECT L1.ID_STORE, L1.ID_BRICK, AVG1, AVG2,
    CASE WHEN AVG1 >= AVG2 THEN 'HIGH TOP3' ELSE 'LOW TOP3' END AS CLASS_TOP
FROM (
    SELECT
        ID_STORE,
        ID_BRICK,
        AVG(V.PRICE) AS AVG1
    FROM CPVBI.dbo.SALES V
    INNER JOIN CPVBI.dbo.STORE L ON L.ID_STORE = V.ID_STORE
    INNER JOIN CPVBI.dbo.BRAND M ON V.ID_BRAND = M.ID_BRAND
    WHERE L.FLAG_STORE = '1'
        AND M.FLAG_BRAND = 'S'
        AND ID_BRAND IN ('53112', '53130', '53111')
    GROUP BY L.ID_BRICK, L.ID_STORE
) L1
INNER JOIN (
    SELECT
        ID_BRICK,
        AVG(V.PRICE) AS AVG2
    FROM CPVBI.dbo.SALES V
    INNER JOIN CPVBI.dbo.STORE L ON (L.ID_STORE=V.ID_STORE)
    INNER JOIN CPVBI.dbo.BRAND M ON(V.ID_BRAND = M.ID_BRAND)
    WHERE L.FLAG_STORE = '1'
        AND M.FLAG_BRAND = 'S'
        AND ID_BRAND IN ('53112', '53130', '53111')
    GROUP BY L.ID_BRICK
) L2 on L1.ID_BRICK = L2.ID_BRICK
ORDER BY L1.ID_STORE;
...