Я хочу сделать расчет внутри выбора из конкретных данных того же столбца.Это возможно? - PullRequest
0 голосов
/ 27 сентября 2019

Я хочу сделать SUM-вычисление, которое несколько раз вызывает мой столбец 'Q' и QBUYERS, но в разных строках это моя таблица:

group   type   Q     QBUYERS
GROUP1  sent   300   200 
GROUP2  shown  400   100
GROUP3  sent   200   150`

И этовот что я пытаюсь сделать:

SELECT 
  notification_batch_id AS group,
  (secondrow) QBUYERS AS PAYERS_EXPOSED,
  SUM(
    CASE 
      WHEN (firstrow)Q <> 0 AND (secondrow)Q <> 0 AND (thirdrow)Q <> 0 
        THEN (
          (
            ((firstrow)QBUYERS / (firstrow)Q) - 
            ((thirdrow)QBUYERS / (thirdrow)Q) 
          ) / ((secondrow)Q / (firstrow)Q) 
        ) 
      ELSE 0 
    END
  ) AS CVR_INCREMENTAL FROM MYTABLE
GROUP BY group;

По сути, делаю вычисления между моими числовыми значениями, а затем группирую свои результаты.Но я не знаю, как «вызвать» мои 300, 400, 200 и т. Д., Не выделив весь столбец.

Я также попробовал это:

SELECT 
  b.QBUYERS AS PAYERS_EXPOSED,
  SUM(
    CASE 
      WHEN a.Q <> 0 AND b.Q <> 0 AND c.Q <> 0 
        THEN (((a.QBUYERS / a.Q) - (c.QBUYERS / c.Q)) / (b.Q/a.Q)) 
      ELSE 0 
    END
  ) AS CVR_INCREMENTAL
FROM (
  SELECT * FROM BASE_FIRST a
  UNION 
  SELECT * FROM BASE_SECOND b
  UNION 
  SELECT * FROM BASE_THIRD c
) AS mytable

BASE_FIRST:

group   type  Q    QBUYERS
GROUP1  sent  300  200`

BASE_SECOND:

group   type  Q    QBUYERS
GROUP2  sent  400  100`

и так далее ... но это не сработало.

Возможно ли это сделать на TERADATA?

1 Ответ

0 голосов
/ 28 сентября 2019

Я не уверен на 100%, что я следую вашей логике здесь, но если вы хотите выполнить запрос, который соответствует только описанному вами конкретному случаю, тогда ваш второй запрос довольно близок.

Просто слегка измените его, чтобы использовать JOIN с вместо UNION с.Таким образом, вы получите одну строку, в которой вы можете сравнить значения в вашем SUM() вместо нескольких строк:

SELECT 
  b.QBUYERS AS PAYERS_EXPOSED,
  SUM(
    CASE 
      WHEN a.Q <> 0 AND b.Q <> 0 AND c.Q <> 0 
        THEN (
          (
            (a.QBUYERS / a.Q) - 
            (c.QBUYERS / c.Q) 
          ) / (b.Q / a.Q) 
        ) 
      ELSE 0 
    END
  ) AS CVR_INCREMENTAL 
FROM MYTABLE a
INNER JOIN MYTABLE b ON b.group = 'GROUP2'
INNER JOIN MYTABLE c ON c.group = 'GROUP3'
WHERE a.group = 'GROUP1'

Это предполагает, что в вашей таблице только три строки - по одной каждаяза GROUP1, GROUP2, GROUP3.

Если вы хотите обработать другой, более сложный сценарий, обновите вопрос этой информацией.

...