Как я могу запросить таблицу, которая позволит использовать несколько фильтров для вычисляемого поля в информационной панели? - PullRequest
1 голос
/ 09 мая 2019

Сначала немного предыстории:

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

В данном конкретном случае я пытаюсь вычислить число, называемое NPS (Net Promoter Score)который основывается на индивидуальной оценке «0» для продукта, которым он владеет.Затем вы берете процент людей, которые дают продукт 9 или 10 (промоутеры), и вычитаете из этого процент людей, которые дали продукт 0-6 (хулители).Это очень базовая математика.

Таким образом, формула выглядит следующим образом: % Промоутеры -% противников = NPS

Теперь наступает момент, когда все усложняется.Используя другие ответы в опросе, я хотел бы иметь возможность отфильтровать этот показатель NPS на основе их группировок из этих других ответов.Для целей этого поста мы оставим его до трех: «Потребительский сегмент» (назовем их S1, S2, S3, S4, S5), Пол (M или F) и Поколение (Gen Z, Millennial, GenX, Бэби-бумер +).

Я смог заставить это работать с одним фильтром, который вы увидите ниже в моем коде.Проблема в том, что одновременно допускается использование нескольких фильтров

CREATE OR REPLACE TABLE
  Dataset1.NewTable1 AS
SELECT
  DISTINCT Segment,
  SUM(Promotor) - SUM(Detractor) AS Net_Promotor_Diff,
  SUM(S1_count) AS S1_Count,
  SUM(S2_count) AS S2_Count,
  SUM(S3_count) AS S3_Count,
  SUM(S4_count) AS S4_Count,
  SUM(S5_count) AS S5_Count,
  SUM(S1_count) + SUM(S2_count) + SUM(S3_count) + SUM(S4_count) + SUM(S5_count) AS Total_Count
FROM (
  SELECT
    ResponseId,
    Segment_column AS Segment,
    IF (SAFE_CAST(NPS_Score AS Int64) > 8, 1, 0) AS Promotor,
    IF (SAFE_CAST(NPS_Score AS Int64) < 7, 1, 0) AS Detractor,
    IF (SAFE_CAST(NPS_Score AS Int64) IN (7, 8), 1, 0) AS Neutral,
    IF (Segment_column = 'Segment 1', 1, 0) AS S1_Count,
    IF (Segment_column = 'Segment 2', 1, 0) AS S2_Count,
    IF (Segment_column = 'Segment 3', 1, 0) AS S3_Count,
    IF (Segment_column = 'Segment 4', 1, 0) AS S4_Count,
    IF (Segment_column = 'Segment 5', 1, 0) AS S5_Count
  FROM
    Dataset1.MainTable
  WHERE
    Segment_column IS NOT NULL )
GROUP BY
  Segment

Этот запрос приводит к следующей таблице.Я сократил имена столбцов, чтобы таблица поместилась в один ряд.

+------+----------+------+------+------+------+------+-------+
| Seg. | NetPDiff | S1_C | S2_C | S3_C | S4_C | S5_C | Total |
+------+----------+------+------+------+------+------+-------+
| S1   |      123 |    0 |  186 |    0 |    0 |    0 |   186 |
| S2   |      272 |  442 |    0 |    0 |    0 |    0 |   442 |
| S3   |       68 |    0 |    0 |    0 |    0 |   99 |    99 |
| S4   |       74 |    0 |    0 |   99 |    0 |    0 |    99 |
| S5   |       66 |    0 |    0 |    0 |  145 |    0 |   145 |
+------+----------+------+------+------+------+------+-------+

Хорошо, надеюсь, я еще не потерял вас.Теперь, ниже, я опубликую вычисленное поле, которое я использую в инструменте панели инструментов, просто чтобы показать вам приложение для этого запроса:

100*(sum(Net_Promotor_Diff)/sum(Total_Count))

Как я уже сказал, у меня это прекрасно работает для сегмента"фильтр.То, что я хочу сделать, это уметь вычислять это поле NPS с несколькими фильтрами над ним, например: что такое NPS, где респонденты являются тысячелетними мужчинами частью 1-го сегмента?

Любые предложения или советы о том, как это сделатьэто будет с благодарностью.Если бы мне пришлось угадывать, этот исходный запрос и таблица, вероятно, не будут работать для того, что я пытаюсь сделать в конце, так как он не допускает многомерных сверток.

...