СРОЧНО! count, group by и 0

Тема в разделе "Базы данных", создана пользователем Горбушка, 2 апр 2014.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.199
    Симпатии:
    2.223
    Код:
    SELECT
          count([NUMBER]),
          NETWORK_ADDRESS
    FROM
          INCIDENTSM1 i1,
          PROBSUMMARYM1 p1
    WHERE
          p1.NETWORK_ADDRESS IN ('Ivanov', 'Petrov', 'Sidorov')
          and
          p1.CLOSE_TIME between '12/01/2013' and '01/01/2014'
          and
          (p1.TPS_STATUS = '50' or p1.TPS_STATUS = '60')
          and
          i1.TPS_PROBSUMMARY_ID = p1.NUMBER
    GROUP BY
          NETWORK_ADDRESS;
    Требуется вывести все строки, а не только те, у которых count возвращает число, т.к. нулевые строки тоже нужны (count = 0, name = имя человека).

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

    Таблиц много - руками нули вставлять не вариант.
     
  2. dwarf

    dwarf Постоялец

    Регистр.:
    12 июн 2011
    Сообщения:
    88
    Симпатии:
    18
    Код:
    SELECT
          count([i1.NUMBER]),
          p1.NETWORK_ADDRESS
    FROM
          PROBSUMMARYM1 p1
          LEFT JOIN INCIDENTSM1 i1
          ON p1.TPS_PROBSUMMARY_ID = i1.NUMBER
    WHERE
          p1.NETWORK_ADDRESS IN ('Ivanov', 'Petrov', 'Sidorov')
          and
          p1.CLOSE_TIME between '12/01/2013' and '01/01/2014'
          and
          (p1.TPS_STATUS = '50' or p1.TPS_STATUS = '60')
    GROUP BY
          p1.NETWORK_ADDRESS;
     
  3. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.199
    Симпатии:
    2.223
    Не помогло =(

    Вру, часть нулей появилась, но не все...

    Код:
    SELECT
          count(i1.TPS_PROBSUMMARY_ID),
          p1.NETWORK_ADDRESS
    FROM
          PROBSUMMARYM1 p1
          LEFT JOIN INCIDENTSM1 i1
          ON i1.TPS_PROBSUMMARY_ID = p1.NUMBER
    WHERE
          p1.NETWORK_ADDRESS IN ('VIKovalev')
          and
          p1.CLOSE_TIME between '01/01/2013' and '01/01/2014'
          and
          (p1.TPS_STATUS = '50' or p1.TPS_STATUS = '60')
    GROUP BY
          NETWORK_ADDRESS
    ORDER BY
            NETWORK_ADDRESS;
    На текущий момент запрос выглядит так... Верю, что туплю... Выводится часть нулей, но не все... ХЗ почему... Возможно по каким-то сотрудникам вообще нет строк - ноль получить всё равно необходимо... Сотрудников более 1000 - руками править не вариант, да и выгрузок больше 20
     
    Последнее редактирование модератором: 2 апр 2014
  4. dwarf

    dwarf Постоялец

    Регистр.:
    12 июн 2011
    Сообщения:
    88
    Симпатии:
    18
    Я даже полез тестовые таблицы у себя создавать, ибо не поверил что так может быть.

    Запрос
    Код:
    SELECT
          count(i1.TPS_PROBSUMMARY_ID),
          p1.NETWORK_ADDRESS
    FROM
          PROBSUMMARYM1 p1
          LEFT JOIN INCIDENTSM1 i1
          ON i1.TPS_PROBSUMMARY_ID = p1.NUMBER
    WHERE
          p1.NETWORK_ADDRESS IN ('VIKovalev')
          and
          p1.CLOSE_TIME between '01/01/2013' and '01/01/2014'
          and
          (p1.TPS_STATUS = '50' or p1.TPS_STATUS = '60')
    GROUP BY
          NETWORK_ADDRESS
    ORDER BY
            NETWORK_ADDRESS;
    Должен вывести только одну строку, ибо p1.NETWORK_ADDRESS IN ('VIKovalev')
    Нужно проверить условия, возможно из-за них часть выборки пропадает.

    По каким-то сотрудникам может не быть строк в табличке PROBSUMMARYM1 ?
    А откуда их тогда взять? :) База про них не знает. Нужно или внести их всех базу или потом обработать выдачу.
     
    Последнее редактирование: 2 апр 2014
  5. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.199
    Симпатии:
    2.223
    Эм... Ну да, верно... Есть способ обойти без создания новой таблицы?
     
  6. dwarf

    dwarf Постоялец

    Регистр.:
    12 июн 2011
    Сообщения:
    88
    Симпатии:
    18
    А можно загрузить недостающих сотрудников в табличку PROBSUMMARYM1 откуда-нибудь?
    Или потом, после получения выборки, слить её с полным списком сотрудников.
    Вообще, все упирается в наличие где-нибудь полного списка сотрудников.
     
  7. Vishez

    Vishez

    Регистр.:
    19 авг 2013
    Сообщения:
    170
    Симпатии:
    81
    Предикат NOT IN пробовали? Поидее можно сделать выборку всех сотрудников из другой таблицы а потом найти те из них которых нет в PROBSUMMARYM1
     
  8. newminer

    newminer Создатель

    Регистр.:
    21 апр 2015
    Сообщения:
    13
    Симпатии:
    4
    надо делать запрос к таблице сотрудников, а уже ее соединять с той таблицей, которую вы указали, тогда на каждого сотрудника обязательно придется строка вывода с результатами
     
Статус темы:
Закрыта.