BernardoMorais
BernardoMorais

Reputation: 631

Create a BigQuery VIEW for each result in query

I created this query:

SELECT
(SELECT value from UNNEST(project.labels) where key = "project") as project,
ROUND(SUM(cost), 2) as cost
FROM cloud.dataset.billing_export
group by ar

And it returns me something like:

Row | project | cost

  1 | PJ1     | 23

  2 | PJ2     | 50

Is there a way to create a VIEW for each value (each project)? I'm trying with UDF and each view must have a name based on the project (eg: view_PJ1) and got something like (but with a lot of errors):

LOOP
SET vars = (SELECT (SELECT value FROM UNNEST(project.labels) WHERE key = "project") AS project
            FROM FROM cloud.dataset.billing_export
            GROUP BY project);
  IF vars=null THEN
    LEAVE;
  END IF;
CREATE OR REPLACE VIEW `cloud`.`dataset`.AR
AS
SELECT DISTINCT
     (SELECT value from UNNEST(project.labels) where key = "project") as project,
     ROUND(SUM(cost), 2) as cost
     FROM cloud.dataset.billing_export
     WHERE project=vars
     GROUP BY project;
END LOOP;

Thanks in advance

Upvotes: 0

Views: 485

Answers (1)

Felipe Hoffa
Felipe Hoffa

Reputation: 59165

This is a script that runs inside BigQuery that generates 4 views - giving each view a name coming out of a SQL query:

DECLARE x INT64 DEFAULT 0;
DECLARE rs ARRAY<STRING>;

SET rs = (
  WITH data AS (SELECT i FROM `fh-bigquery.public_dump.numbers_255` WHERE i < 4)
  SELECT ARRAY_AGG( 
    'CREATE OR REPLACE VIEW `temp.number' || i
    ||'` AS SELECT i FROM `fh-bigquery.public_dump.numbers_255` WHERE i=' || i
  )  
  FROM data
);

LOOP
  EXECUTE IMMEDIATE(SELECT rs[OFFSET(x)]);
  SET x = x + 1;
  IF x >= ARRAY_LENGTH(rs) THEN
    LEAVE;
  END IF;
END LOOP;

The secret is to use EXECUTE IMMEDIATE with a generated string creating the view.

Upvotes: 2

Related Questions