Sql Расчетная группа по синтаксической возможности - PullRequest
0 голосов
/ 27 апреля 2018

Итак, у меня есть эта команда оболочки, которая создает CSV из выбора, но это не очень важно. Проблема, которую я имею, состоит в том, что одно из полей, которые я выбираю, является целочисленным полем, работающим как поле даты ггггммдд. Поэтому я хочу выбрать поле / 100, чтобы получить ггггмм, сгруппировать его и остальные поля и суммировать последнее.

    SELECT trim(a.F1)||chr(44)||trim(b.F2)||chr(44)||trim(F3)||chr(44)
        ||trim(F4)||chr(44)|||CAST(plandate/100 AS INT)||chr(44)
        ||trim(F5)||chr(44)||trim(F6)||chr(44)||trim(true_dem)
        as "F1, F2, F3, F4, YYYYMM, F5, F6, MONTHLY_DEMAND" 
      from T1 a 
      join T2 b on a.ASDF = b.ASDF 
      WHERE PLANDATE > 20180400

Итак, как вы можете видеть прямо сейчас, я беру все даты после определенной даты, но у меня нет группы по логике, причина этого в том, что я могу группировать по всем "F "поля, но я не знаю, что группировать для даты подачи, так как она рассчитывается CAST (plandate / 100 AS INT)

Я пытался сделать это так

    SELECT trim(a.f1)||chr(44)||trim(b.f2)||chr(44)||trim(f3)||chr(44)
        ||trim(f4)||chr(44)||CAST( plandate/100 AS INT)||chr(44)
        ||trim(f5)||chr(44)||trim(f6)||chr(44)||sum(true_dem)
        as "f1, f2, f3, f4, YYYYMM, f5, f6, MONTHLY_DEMAND" 
      from t1 a 
      join t2 b on a.f1 = b.f1 
      WHERE PLANDATE > 20180400
      group by a.f1, f2, f3, f4, f5, f6, (CAST( plandate/100 AS INT))

но, очевидно, это неправильно, поскольку я получаю [SQL0122] столбец PLANDATE или выражение в списке SELECT недопустимым. ошибка. в значительной степени просто говорю, что это не хорошо. Я действительно хотел бы сохранить этот псевдоним, если это возможно, чтобы я мог экспортировать его в CSV с заголовками столбцов

игнорировать вещи fx и tx, я просто хотел отрубить любые намеки на базу данных компании. Если это имеет значение, я запускаю это на DB2 серии I через qsh

1 Ответ

0 голосов
/ 27 апреля 2018

Разве это не выводит заголовки столбцов так, как вы хотите:

SELECT   
  a.f1, b.f2, f3, f4, CAST( plandate/100 AS INT) as YYYYMM, 
  f5, f6, sum(true_dem) as MONTHLY_DEMAND
from t1 a join t2 b on a.f1 = b.f1 
WHERE PLANDATE > 20180400
group by a.f1, f2, f3, f4, f5, f6, (CAST( plandate/100 AS INT))

Если вы считаете, что вам нужно сделать это по-своему, просто используйте подвыбор, чтобы сначала выполнить агрегирование:

SELECT   
    trim(f1)||chr(44)||trim(f2)||chr(44)||trim(f3)||chr(44)||trim(f4)||chr(44)
    ||CAST( plandate/100 AS INT)||chr(44)||trim(f5)||chr(44)||trim(f6)||chr(44)
    ||sum(true_dem) 
    as "f1, f2, f3, f4, YYYYMM, f5, f6, MONTHLY_DEMAND"
FROM (
  SELECT 
    a.f1, b.f2, f3, f4, CAST( plandate/100 AS INT) as YYYYMM, 
    f5, f6, sum(true_dem) as MONTHLY_DEMAND
  from t1 a join t2 b on a.f1 = b.f1 
  WHERE PLANDATE > 20180400
  group by a.f1, f2, f3, f4, f5, f6, (CAST( plandate/100 AS INT))
) t
...