Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 重新构造表并检查值_Sql_Google Bigquery - Fatal编程技术网

Sql 重新构造表并检查值

Sql 重新构造表并检查值,sql,google-bigquery,Sql,Google Bigquery,我有一张表(表1),如下所示- keys AAB12B34 CC34DE5W SEF5C6T4 SQA7ZZ87 LM24NO3P X34YY78Z category_id category_name associated_keys 111 Books CC34DE5W|SQA7ZZ87|LM24NO3P 222 Office LM24NO3P|AAB12B34 444 Furn

我有一张表(表1),如下所示-

keys
AAB12B34
CC34DE5W
SEF5C6T4
SQA7ZZ87
LM24NO3P
X34YY78Z
category_id   category_name    associated_keys
    111          Books         CC34DE5W|SQA7ZZ87|LM24NO3P
    222          Office        LM24NO3P|AAB12B34
    444         Furniture      X34YY78Z|LM24NO3P|SQA7ZZ87|SEF5C6T4|CC34DE5W|AAB12B34
    222          Office        X34YY78Z
另一张表(表2)如下所示-

keys
AAB12B34
CC34DE5W
SEF5C6T4
SQA7ZZ87
LM24NO3P
X34YY78Z
category_id   category_name    associated_keys
    111          Books         CC34DE5W|SQA7ZZ87|LM24NO3P
    222          Office        LM24NO3P|AAB12B34
    444         Furniture      X34YY78Z|LM24NO3P|SQA7ZZ87|SEF5C6T4|CC34DE5W|AAB12B34
    222          Office        X34YY78Z
我想做两件事-

任务1:

SELECT
  category_id, category_name, STRING_AGG(associated_keys, "|") AS associated_keys
FROM
  dataset.table2
GROUP BY 
  category_id, category_name;
CREATE OR REPLACE VIEW
  dataset.vw_table2 AS
SELECT
  category_id, category_name, STRING_AGG(associated_keys, '|') AS associated_keys
FROM
  dataset.table2
GROUP BY category_id, category_name;
DECLARE
  dynamicsql STRING;
SET
  dynamicsql = (
  SELECT
    'select category_id, category_name, ' || STRING_AGG('IF(associated_keys LIKE "%' || keys || '%", 1, 0) AS ' || keys, ',') || ' from dataset.vw_table2'
  FROM
    dataset.table1);
EXECUTE IMMEDIATE
  dynamicsql;
在任何给定点,我希望每个类别id只有一行。如果有两行(意思是如果id重复),那么我希望按类别id分组并添加相关的关键字。所以,这张桌子的外面应该是这样的-

category_id  category_name AAB12B34  CC34DE5W   SEF5C6T4    SQA7ZZ87   LM24NO3P   X34YY78Z
    111         Books         0          1         0            1          1          0
    222        Office         1          0         0            0          1          1
    444       Furniture       1          1         1            1          1          1
表3-

category_id   category_name    associated_keys
    111          Books         CC34DE5W|SQA7ZZ87|LM24NO3P
    222          Office        LM24NO3P|AAB12B34|X34YY78Z
    444         Furniture      X34YY78Z|LM24NO3P|SQA7ZZ87|SEF5C6T4|CC34DE5W|AAB12B34
任务2:

SELECT
  category_id, category_name, STRING_AGG(associated_keys, "|") AS associated_keys
FROM
  dataset.table2
GROUP BY 
  category_id, category_name;
CREATE OR REPLACE VIEW
  dataset.vw_table2 AS
SELECT
  category_id, category_name, STRING_AGG(associated_keys, '|') AS associated_keys
FROM
  dataset.table2
GROUP BY category_id, category_name;
DECLARE
  dynamicsql STRING;
SET
  dynamicsql = (
  SELECT
    'select category_id, category_name, ' || STRING_AGG('IF(associated_keys LIKE "%' || keys || '%", 1, 0) AS ' || keys, ',') || ' from dataset.vw_table2'
  FROM
    dataset.table1);
EXECUTE IMMEDIATE
  dynamicsql;
然后,我想将表1字段内的所有值转换为列名,然后选中表2。如果某个特定的类别\u id关联的\u keys字段中有该键,则我想在该键字段下添加1,否则插入0

最后,结果如下所示-

category_id  category_name AAB12B34  CC34DE5W   SEF5C6T4    SQA7ZZ87   LM24NO3P   X34YY78Z
    111         Books         0          1         0            1          1          0
    222        Office         1          0         0            0          1          1
    444       Furniture       1          1         1            1          1          1
您可以尝试以下方法:

第一个答案:

SELECT
  category_id, category_name, STRING_AGG(associated_keys, "|") AS associated_keys
FROM
  dataset.table2
GROUP BY 
  category_id, category_name;
CREATE OR REPLACE VIEW
  dataset.vw_table2 AS
SELECT
  category_id, category_name, STRING_AGG(associated_keys, '|') AS associated_keys
FROM
  dataset.table2
GROUP BY category_id, category_name;
DECLARE
  dynamicsql STRING;
SET
  dynamicsql = (
  SELECT
    'select category_id, category_name, ' || STRING_AGG('IF(associated_keys LIKE "%' || keys || '%", 1, 0) AS ' || keys, ',') || ' from dataset.vw_table2'
  FROM
    dataset.table1);
EXECUTE IMMEDIATE
  dynamicsql;
第二个答案:

SELECT
  category_id, category_name, STRING_AGG(associated_keys, "|") AS associated_keys
FROM
  dataset.table2
GROUP BY 
  category_id, category_name;
CREATE OR REPLACE VIEW
  dataset.vw_table2 AS
SELECT
  category_id, category_name, STRING_AGG(associated_keys, '|') AS associated_keys
FROM
  dataset.table2
GROUP BY category_id, category_name;
DECLARE
  dynamicsql STRING;
SET
  dynamicsql = (
  SELECT
    'select category_id, category_name, ' || STRING_AGG('IF(associated_keys LIKE "%' || keys || '%", 1, 0) AS ' || keys, ',') || ' from dataset.vw_table2'
  FROM
    dataset.table1);
EXECUTE IMMEDIATE
  dynamicsql;
标准SQL选项

动态SQL选项

创建视图:

SELECT
  category_id, category_name, STRING_AGG(associated_keys, "|") AS associated_keys
FROM
  dataset.table2
GROUP BY 
  category_id, category_name;
CREATE OR REPLACE VIEW
  dataset.vw_table2 AS
SELECT
  category_id, category_name, STRING_AGG(associated_keys, '|') AS associated_keys
FROM
  dataset.table2
GROUP BY category_id, category_name;
DECLARE
  dynamicsql STRING;
SET
  dynamicsql = (
  SELECT
    'select category_id, category_name, ' || STRING_AGG('IF(associated_keys LIKE "%' || keys || '%", 1, 0) AS ' || keys, ',') || ' from dataset.vw_table2'
  FROM
    dataset.table1);
EXECUTE IMMEDIATE
  dynamicsql;
创建动态SQL:

SELECT
  category_id, category_name, STRING_AGG(associated_keys, "|") AS associated_keys
FROM
  dataset.table2
GROUP BY 
  category_id, category_name;
CREATE OR REPLACE VIEW
  dataset.vw_table2 AS
SELECT
  category_id, category_name, STRING_AGG(associated_keys, '|') AS associated_keys
FROM
  dataset.table2
GROUP BY category_id, category_name;
DECLARE
  dynamicsql STRING;
SET
  dynamicsql = (
  SELECT
    'select category_id, category_name, ' || STRING_AGG('IF(associated_keys LIKE "%' || keys || '%", 1, 0) AS ' || keys, ',') || ' from dataset.vw_table2'
  FROM
    dataset.table1);
EXECUTE IMMEDIATE
  dynamicsql;
快照:
下面是BigQuery标准SQL

任务1

如果要应用于问题中的样本数据,如下例所示-

#standardSQL
WITH `project.dataset.data` AS (
  SELECT 111 category_id, 'Books' category_name, 'CC34DE5W|SQA7ZZ87|LM24NO3P' associated_keys UNION ALL
  SELECT 222, 'Office', 'LM24NO3P|AAB12B34' UNION ALL
  SELECT 444, 'Furniture', 'X34YY78Z|LM24NO3P|SQA7ZZ87|SEF5C6T4|CC34DE5W|AAB12B34' UNION ALL
  SELECT 222, 'Office', 'X34YY78Z' 
)
SELECT category_id, category_name, STRING_AGG(associated_keys, '|') AS associated_keys
FROM `project.dataset.data` 
GROUP BY category_id, category_name   
输出为

Row category_id category_name   associated_keys  
1   111         Books           CC34DE5W|SQA7ZZ87|LM24NO3P   
2   222         Office          LM24NO3P|AAB12B34|X34YY78Z   
3   444         Furniture       X34YY78Z|LM24NO3P|SQA7ZZ87|SEF5C6T4|CC34DE5W|AAB12B34     
Row category_id category_name   AAB12B34    CC34DE5W    SEF5C6T4    SQA7ZZ87    LM24NO3P    X34YY78Z     
1   111         Books           0           1           0           1           1           0    
2   222         Office          1           0           0           0           1           1    
3   444         Furniture       1           1           1           1           1           1   
任务2-使用BQ的脚本功能并动态构建所需的pivot语句,并且不依赖于键的数量和名称,因此消除了手动构建select语句

当应用于问题中的样本数据时-输出为

Row category_id category_name   AAB12B34    CC34DE5W    SEF5C6T4    SQA7ZZ87    LM24NO3P    X34YY78Z     
1   111         Books           0           1           0           1           1           0    
2   222         Office          1           0           0           0           1           1    
3   444         Furniture       1           1           1           1           1           1   

下面是关于BigQuery标准SQL和积累您案例中所有新的细微差别-希望您能够使这个新的清理版本适合您(注意:它实际上与我最初的回答中的逻辑相同,但对以数字开头的列名进行了一些更正,在表1中使用正确的列名,等等)

上表假设下表结构(和样本数据)

如果要将代码应用于上述示例数据

`your_project.your_dataset.keys` AS (
    SELECT 'AAB12B34' ids UNION ALL
    SELECT '34DE5WCC' UNION ALL
    SELECT 'SEF5C6T4' UNION ALL
    SELECT 'SQA7ZZ87' UNION ALL
    SELECT '24NO3PLM' UNION ALL
    SELECT 'X34YY78Z' 
  ), `your_project.your_dataset.data` AS (
    SELECT 111 category_id, 'Books' category_name, '34DE5WCC|SQA7ZZ87|24NO3PLM|SQA7ZZ87|sample300|sample300' associated_keys UNION ALL
    SELECT 222, 'Office', '24NO3PLM|AAB12B34|X34YY78Z' UNION ALL
    SELECT 444, 'Furniture', 'X34YY78Z|24NO3PLM|SQA7ZZ87|SEF5C6T4|34DE5WCC|AAB12B34|sample200' UNION ALL
    SELECT 222, 'Office', 'X34YY78Z|sample100' UNION ALL
    SELECT 111, 'Books', 'AAB12B34' 
  )   
结果是

Row category_id category_name   col_AAB12B34    col_34DE5WCC    col_SEF5C6T4    col_SQA7ZZ87    col_24NO3PLM    col_X34YY78Z     
1   111         Books           1               1               0               1               1               0    
2   222         Office          1               0               0               0               1               1    
3   444         Furniture       1               1               1               1               1               1    

这是一个错误。上面写着“无法识别的名称:密钥”看起来像是输入错误或复制/粘贴错误-请给我一秒钟时间翻倍check@user11035754-我只是反复检查并确认我的答案对Task1和Task2都有效。重要信息-它们假设存在两个表
project.dataset.keys
(表1)和
project.dataset.data
(表2)-因此您需要用您的实际姓名替换它们-请告诉我-应该有效!正如我所说的,我只是重复检查并得到结果,正如我在回答中所说的那样,我确实替换了表名,还修复了“UnrecognedName:key”错误。现在我收到另一个错误-无效的执行即时sql字符串`选择类别id,类别名称,如果(关联的关键字,如“%AAB12B34%”,1,0)作为AAB12B34,如果……….(对于每个关键字)语法错误:在[x:y]处的文字和别名之间缺少空格我怀疑您可能会在替换时稍微调整代码-请发布您的最终代码,我将说明问题所在-发布为问题的更新-不要对此使用注释,因为注释中的格式会丢失,但重要的是要看到它会出现以下错误-无效的立即执行sql字符串`选择类别\ id,类别\名称,IF(关联的_键,如“%AAB12B34%”,1,0)作为AAB12B34,IF……….(对于每个键)语法错误:在[x:y]处的文字和别名之间缺少空格,现在添加了resultWorks的快照。谢谢。非常感谢您的努力。此查询处理2条语句,运行此查询后,我必须单击查看结果以查看结果。是否有办法使用大查询中的“查询设置”自动将结果保存在某个表中,并指定要存储结果的表的名称?当然。您可以使用DML的INSERT语句或DDL的CREATE语句作为EXECUTE IMMEDIATE的一部分。我在这样做时遇到了一些错误。你能修改你的答案来适应吗?如果需要的话,很乐意发布一个新问题。谢谢,我完全理解。没问题。将发布一个新问题。谢谢