Ответы пользователя по тегу Firebird
  • Группировка с выборкой?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Делайте вместо
    COUNT(*)
    подзапрос.
    SELECT
      case when id in (1,2,3,4) then 'Начальная школа'
              when id in (5,6,7,8,9) then 'Средняя школа'
              when id in (10,11) then 'Старшая школа'
              end AS Class_type,
      (
        SELECT COUNT(*) 
        FROM class cc 
        WHERE (
          case when сс.id in (1,2,3,4,5) then 'Начальная школа'
          when cc.id in (6,7,8,9) then 'Средняя школа'
          when cc.id in (10,11) then 'Старшая школа'
        ) = (
          case when c.id in (1,2,3,4) then 'Начальная школа'
          when c.id in (5,6,7,8,9) then 'Средняя школа'
          when c.id in (10,11) then 'Старшая школа'
        )
      ), 
      SUM(case when s.ocenka>4 then 1 end) AS 'Отличники' 
    FROM class c
    GROUP BY Class_type

    Как-то так через задницу. Запутано. Не проверял, нет файрбёрда под рукой
    Ответ написан
  • Как правильно выполнить sql запрос при помощи bat файла?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Попробуйте так:
    set isql="C:\\Program Files(x86)\\FireBird\\FireBird_2_1\\BIN\\isql.exe"
    echo ^
    SELECT C.CODE AS "Табельный", C.NAME AS "Ф.И.О.", T.TRANZDATE AS "Дата", max(T.TRANZTIME) AS "Время", T.INFOSTR AS "Карта" sum(T.SUMM) AS "Сумма" FROM DOCUMENT D LEFT JOIN TRANZT T ON D.ID = T.DOCUMENTID JOIN CLIENT C ON D.CLIENTID = C.ID WHERE T.TRANZDATE = cast('now' as date) and D.STATE = 1 AND D.ISFISCAL = 1 AND D.CLIENTID >=0 AND T.TRANZTYPE = '36' GROUP BY C.CODE, C.NAME, T.TRANZDATE, T.INFOSTR; ^
    | %isql% 127.0.0.1/3050:E:\Torgovlya54\MAIN.GDB sysdba masterkey > outputfile.txt

    Каждая строчка, передаваемая isql должна закачиваться "^", чтобы попасть в одну команду с echo и передаться на вход isql.
    Весь выхлоп isql направлен в текстовый файл.
    У меня винды под рукой нет и файрбёрда тем более. так что пробуйте сами. Пишите если не получится -- будем еще смотреть.
    Ответ написан
  • Как посчитать сумму одинаковых значений по одной колонке, но разных по другой?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Уберите T.TRANZTIME из группировки и из селекта. Там два разных значения.
    Если вам обязательно надо какое-то показать (например последнее), то выкиньте его из группировки, а в селекте поставьте там агрегатор, например, max.
    Вот так ваш Сидоров просуммируется на этом датасете в одну строку:
    SELECT
        C.CODE AS "Табельный",
        C.NAME AS "Ф.И.О.",
        T.TRANZDATE AS "Дата",
        max(T.TRANZTIME) AS "Время",
        T.INFOSTR AS "Карта",
        sum(T.SUMM) AS "Сумма"
    FROM 
        DOCUMENT D
            LEFT JOIN TRANZT T ON D.ID = T.DOCUMENTID
            JOIN CLIENT C ON D.CLIENTID = C.ID
    WHERE
          T.TRANZDATE >='20.02.2020' AND T.TRANZDATE <='20.02.2020' AND
          T.TRANZTIME >='18:55:00' AND T.TRANZTIME <='23:59:59' AND
          D.STATE = 1 AND
          D.ISFISCAL = 1 AND
          D.CLIENTID >=0 AND
          T.TRANZTYPE = '36'
    GROUP BY
        C.CODE,
        C.NAME,
        T.TRANZDATE,
    --    T.TRANZTIME,
        T.INFOSTR
    --    ,T.SUMM

    Но на этом ваши проблемы не кончатся. В вашем SQL много других косяков:
    1. Какой смысл делать такое условие: T.TRANZTIME <='23:59:59'? Любое время будет ему удовлетворять.
    2. Если ваши дата и время связаны, то есть определяют какой-то момент во времени, то их нужно хранить и фильтровать как единое значение, иначе вы сами не заметите как наткнётесь на не очевидную (для новичка) ошибку неконсистентности. К примеру, событие Б позднее события А, но А произошло вечером, а Б утром (другого дня). При вашем отдельном сравнении дат и времён может получиться некорректность из-за того, что время (без даты) события А > времени (без даты) события Б. Соедините дату и время в единое поле datetime или соединяйте их каждый раз когда делаете условную фильтрацию по временнОму диапазону.
    3. Зачем вы группируете по T.SUMM, если собирались агрегировать это поле?
    Ответ написан