Имя: Пароль:
1C
 
Помогите составить запрос
0 dergreche
 
31.08.15
09:34
Есть таблица из 5 колонок с набором аналитик
ВидАналит1    ВидАналит2    ВидАналит3    ВидАналит4    Кол
------------------------------------------------------------------------------------------
Аналитика1А    Аналитика2А    Аналитика3А    Аналитика4А    4.0
Аналитика1А    Аналитика2А    Аналитика3Б    Аналитика4В    5.0
Аналитика1Б    Аналитика2Б    Аналитика3А    Аналитика4А    3.4
Аналитика1А    Аналитика2А    Аналитика3В    Аналитика4Б    2.5
Аналитика1Б    Аналитика2Б    Аналитика3Б    Аналитика4Г    6.0
Аналитика1Б    Аналитика2Б    Аналитика3В    Аналитика4Д    5.0

Во второй таблице задаются условия связи с первой таблицей по колонкам Фильтр-ВидАналит по соответствующим индексам. Например
Колонка1    Фильтр1    Фильтр2    Фильтр3    Фильтр4    Показатель
--------------------------------------------------------------------------------------------------------------------------
Спр1        все        все        все        все        100
Спр1        Аналитика1А    Аналитика2А    Аналитика3Б    Аналитика4В    200
Спр1        Аналитика1Б    все        все        все        150
Спр1        Аналитика1Б    Аналитика2Б    все        все        180
Необходимо запросом распределить вторую таблицу по первой с учетом связи по фильтрам аналитик
1 Cube
 
31.08.15
09:52
Свзязывешь обе таблицы полным соединением и через ВЫБОР КОГДА ТОГДА КОНЕЦ тянешь показатели.
2 dergreche
 
31.08.15
10:13
я пожалуй уточню. При объединении нужно исключить строки с показателями сформированные по условиям фильтра более высокого уровня. Т.е.

должна остаться строка Спр1        Аналитика1А    Аналитика2А    Аналитика3Б    Аналитика4В    200

а строка сформированная по условиям где не заданы филтры 1..4
Спр1        Аналитика1А    Аналитика2А    Аналитика3Б    Аналитика4В    100
не должна включаться в запрос
3 Cube
 
31.08.15
10:17
(2) Мой ответ остается неизменным...

В тех строках, где условия не выполняются, не бери показатель со второй таблицы, а ставь 0. Потом сгруппируешь итоговую таблицу и суммируешь показатели с одинаковой аналитикой.
4 igork1966
 
31.08.15
10:19
(2) Ответь что такое "фильтр более высокого уровня".
А потом, подумай что будет если фильтры будут выглядеть так:

Спр1,Аналитика1Б,все        ,все,все,150
Спр1,все        ,Аналитика2Б,все,все,180

Какая из строк "более высокого уровня"?
5 dergreche
 
31.08.15
10:33
Фильтр задается последовательно от 1 до 4. Не может быть ситуации
Спр1,все        ,Аналитика2Б,все,все,180

Фильтр2 нельзя задать не задав Фильтр1
6 Cube
 
31.08.15
10:39
(2) Ты косячишь: по условиям (0) должна получиться не
Спр1        Аналитика1А    Аналитика2А    Аналитика3Б    Аналитика4В    200
а
Спр1        Аналитика1А    Аналитика2А    Аналитика3Б    Аналитика4В    300
т.к. есть ещё строка таблицы 2
Спр1        все        все        все        все        100

=))
7 Cube
 
31.08.15
10:39
(5) Короче, больше разговоров...
На, разбирайся:

ВЫБРАТЬ
    "Аналитика1А" КАК ВидАналит1,
    "Аналитика2А" КАК ВидАналит2,
    "Аналитика3А" КАК ВидАналит3,
    "Аналитика4А" КАК ВидАналит4,
    4 КАК Кол
ПОМЕСТИТЬ Таблица1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Аналитика1А",
    "Аналитика2А",
    "Аналитика3Б",
    "Аналитика4В",
    5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Аналитика1Б",
    "Аналитика2Б",
    "Аналитика3А",
    "Аналитика4А",
    3.4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Аналитика1А",
    "Аналитика2А",
    "Аналитика3В",
    "Аналитика4Б",
    2.5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Аналитика1Б",
    "Аналитика2Б",
    "Аналитика3Б",
    "Аналитика4Г",
    6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Аналитика1Б",
    "Аналитика2Б",
    "Аналитика3В",
    "Аналитика4Д",
    5
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    "Спр1" КАК Колонка1,
    "все" КАК Фильтр1,
    "все" КАК Фильтр2,
    "все" КАК Фильтр3,
    "все" КАК Фильтр4,
    100 КАК Показатель
ПОМЕСТИТЬ Таблица2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Спр1",
    "Аналитика1А",
    "Аналитика2А",
    "Аналитика3Б",
    "Аналитика4В",
    200

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Спр1",
    "Аналитика1Б",
    "все",
    "все",
    "все",
    150

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Спр1",
    "Аналитика1Б",
    "Аналитика2Б",
    "все",
    "все",
    180
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Таблица2.Колонка1 КАК Колонка1,
    Таблица1.ВидАналит1 КАК ВидАналит1,
    Таблица1.ВидАналит2 КАК ВидАналит2,
    Таблица1.ВидАналит3 КАК ВидАналит3,
    Таблица1.ВидАналит4 КАК ВидАналит4,
    Таблица1.Кол КАК Кол,
    СУММА(ВЫБОР
            КОГДА (Таблица2.Фильтр1 = "все"
                    ИЛИ Таблица2.Фильтр1 = Таблица1.ВидАналит1)
                    И (Таблица2.Фильтр2 = "все"
                        ИЛИ Таблица2.Фильтр2 = Таблица1.ВидАналит2)
                    И (Таблица2.Фильтр3 = "все"
                        ИЛИ Таблица2.Фильтр3 = Таблица1.ВидАналит3)
                    И (Таблица2.Фильтр4 = "все"
                        ИЛИ Таблица2.Фильтр4 = Таблица1.ВидАналит4)
                ТОГДА Таблица2.Показатель
            ИНАЧЕ 0
        КОНЕЦ) КАК Показатель
ИЗ
    Таблица1 КАК Таблица1
        ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
        ПО (ИСТИНА)

СГРУППИРОВАТЬ ПО
    Таблица2.Колонка1,
    Таблица1.ВидАналит1,
    Таблица1.ВидАналит2,
    Таблица1.ВидАналит4,
    Таблица1.ВидАналит3,
    Таблица1.Кол
8 Cube
 
31.08.15
10:41
+(7) Первые два пакета - просто описание твоих таблиц, ты их заменишь реальными. Нужный тебе кусок, о котором я говорил в (1):

ВЫБРАТЬ
    Таблица2.Колонка1 КАК Колонка1,
    Таблица1.ВидАналит1 КАК ВидАналит1,
    Таблица1.ВидАналит2 КАК ВидАналит2,
    Таблица1.ВидАналит3 КАК ВидАналит3,
    Таблица1.ВидАналит4 КАК ВидАналит4,
    Таблица1.Кол КАК Кол,
    СУММА(ВЫБОР
            КОГДА (Таблица2.Фильтр1 = "все"
                    ИЛИ Таблица2.Фильтр1 = Таблица1.ВидАналит1)
                    И (Таблица2.Фильтр2 = "все"
                        ИЛИ Таблица2.Фильтр2 = Таблица1.ВидАналит2)
                    И (Таблица2.Фильтр3 = "все"
                        ИЛИ Таблица2.Фильтр3 = Таблица1.ВидАналит3)
                    И (Таблица2.Фильтр4 = "все"
                        ИЛИ Таблица2.Фильтр4 = Таблица1.ВидАналит4)
                ТОГДА Таблица2.Показатель
            ИНАЧЕ 0
        КОНЕЦ) КАК Показатель
ИЗ
    Таблица1 КАК Таблица1
        ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
        ПО (ИСТИНА)

СГРУППИРОВАТЬ ПО
    Таблица2.Колонка1,
    Таблица1.ВидАналит1,
    Таблица1.ВидАналит2,
    Таблица1.ВидАналит4,
    Таблица1.ВидАналит3,
    Таблица1.Кол
9 Cube
 
31.08.15
10:43
+(7) (8) Ой, у меня левое соединение получилось... Ну сам тестируй, нужно там полное или нет, а то зарплату-то тебе получать, сделай хоть что-нибудь))
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс