首页 > 解决方案 > 我想从同一列的特定数据中选择一个内部进行计算。这可能吗?

问题描述

我想做一个 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 上做到吗?

标签: sqlteradataalation

解决方案


我不是 100% 确定我在这里遵循您的逻辑,但是如果您想运行一个仅与您描述的特定情况匹配的查询,那么您的第二个查询非常接近。

只需稍微修改它以使用JOINs 而不是UNIONs。这样,您将得到单行,您可以在其中比较您的值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.

如果您想处理不同的、更复杂的场景,请使用此信息更新问题。


推荐阅读