Сначала немного предыстории:
Я работаю над проектом для работы, и я действительно озадачен этим.У меня пока относительно небольшой набор данных, который состоит примерно из 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-го сегмента?
Любые предложения или советы о том, как это сделатьэто будет с благодарностью.Если бы мне пришлось угадывать, этот исходный запрос и таблица, вероятно, не будут работать для того, что я пытаюсь сделать в конце, так как он не допускает многомерных сверток.