Deaggrigate затем применить с накопительным - PullRequest
1 голос
/ 19 января 2012

нужно просто немного подправить мой запрос.У меня есть таблица, которая заполнена назначениями и значениями, такими как:

a_inv
assignment_id    total
=========================
1                500

Затем две связанные таблицы, категории и каналы для назначения, например:

a_cat
assignment_id    category_id
==============================
1                1
1                11

a_ch
assignment_id    channel_id
==============================
1                16
1                25

Итак, мне нужно выяснить, сколько было потрачено на категорию и канал (с накоплением).

Вот запрос, с которым я получил наиболее близкий ответ:

SELECT 
    ac.category_id, ach.channel_id, ((ia.total/COUNT(DISTINCT ac2.category_id))/COUNT(DISTINCT ach2.channel_id)) AS cur_total
FROM 
    a_cat ac
LEFT JOIN 
    a_ch ach ON ach.assignment_id = ac.assignment_id
LEFT JOIN 
    a_inv ia ON ia.assignment_id = ac.assignment_id
LEFT JOIN
    a_cat ac2 ON ach.assignment_id = ac2.assignment_id
LEFT JOIN 
    a_ch ach2 ON ach2.assignment_id = ac.assignment_id
WHERE
    ac.assignment_id = 1
GROUP BY
    ac.category_id, ach.channel_id WITH ROLLUP

Это дает мнерезультат, который очень близок к тому, что мне нужно:

category_id   channel_id   cur_total
=====================================
1             16           125.0000
1             25           125.0000
1             NULL         125.0000     <---- this should be "250.0000"
11            16           125.0000
11            25           125.0000
11            NULL         125.0000     <---- this should be "250.0000"
NULL          NULL         125.0000     <---- this should be "500.0000"

Любая помощь очень ценится.

Спасибо!

1 Ответ

2 голосов
/ 19 января 2012

Попробуйте это

SELECT category_id, channel_id, SUM(cur_total) 
FROM (
    SELECT 
        ac.category_id, ach.channel_id, ((ia.total/COUNT(DISTINCT ac2.category_id))/COUNT(DISTINCT ach2.channel_id)) AS cur_total
    FROM 
        a_cat ac
    LEFT JOIN 
        a_ch ach ON ach.assignment_id = ac.assignment_id
    LEFT JOIN 
        a_inv ia ON ia.assignment_id = ac.assignment_id
    LEFT JOIN
        a_cat ac2 ON ach.assignment_id = ac2.assignment_id
    LEFT JOIN 
        a_ch ach2 ON ach2.assignment_id = ac.assignment_id
    WHERE
        ac.assignment_id = 1
    GROUP BY
        ac.category_id, ach.channel_id
    ) as t1
GROUP BY category_id, channel_id WITH ROLLUP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...