Mysql 使用Google SQL或BIGQUERY取消激活多个列

Mysql 使用Google SQL或BIGQUERY取消激活多个列,mysql,google-bigquery,react-native-ble-plx,Mysql,Google Bigquery,React Native Ble Plx,我一直在尝试从google sheets表中取出一个表,如下所示,放入(EAV)或Date、ldap、Shift: Date Ldap1 Ldap2 Ldap3 </p> 2020-04-01 Shift A Shift B Shift C </p> 2020-04-02 Shift A Shift B Shift C</p> 2020-04-03 Shift A Shift

我一直在尝试从google sheets表中取出一个表,如下所示,放入(EAV)或Date、ldap、Shift:

        Date    Ldap1   Ldap2   Ldap3 </p>
       2020-04-01   Shift A Shift B Shift C </p>
       2020-04-02   Shift A Shift B Shift C</p>
       2020-04-03   Shift A Shift B Shift C</p> 
结果:

date    id_name id
2020-04-01  Ldap1   Shift A
2020-04-01  Ldap2   Shift B
2020-04-02  Ldap1   Shift A
2020-04-02  Ldap2   Shift B
2020-04-03  Ldap1   Shift A
2020-04-03  Ldap2   Shift B
2020-04-04  Ldap1   Shift A
2020-04-04  Ldap2   Shift B
2020-04-05  Ldap1   Shift A
2020-04-05  Ldap2   Shift B
2020-04-06  Ldap1   Shift A
2020-04-06  Ldap2   Shift B
2020-04-07  Ldap1   WO
2020-04-07  Ldap2   WO
2020-04-08  Ldap1   WO
2020-04-08  Ldap2   WO
2020-04-09  Ldap1   Shift A
2020-04-09  Ldap2   Shift B
2020-04-10  Ldap1   Shift A
2020-04-10  Ldap2   Shift B
2020-04-11  Ldap1   Shift A
2020-04-11  Ldap2   Shift B
2020-04-12  Ldap1   Shift A
2020-04-12  Ldap2   Shift B
2020-04-13  Ldap1   Shift A
2020-04-13  Ldap2   Shift B
2020-04-14  Ldap1   Shift A
2020-04-14  Ldap2   Shift B
2020-04-15  Ldap1   WO
2020-04-15  Ldap2   WO
2020-04-16  Ldap1   WO
2020-04-16  Ldap2   WO
2020-04-17  Ldap1   Shift A
2020-04-17  Ldap2   Shift B
2020-04-18  Ldap1   Shift A

下面是BigQuery标准SQL

#standardSQL
SELECT `date`,
  SPLIT(kv, ':')[OFFSET(0)] id_name,
  SPLIT(kv, ':')[OFFSET(1)] id
FROM `project.dataset.table` t,
UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), r'[{}"]', ''))) kv
WHERE SPLIT(kv, ':')[OFFSET(0)] != 'date'
如果要应用于问题中的样本数据,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT DATE '2020-04-01' `date`, 'Shift A' ldap1, 'Shift B' ldap2,  'Shift C' ldap3 UNION ALL
  SELECT '2020-04-02', 'Shift A', 'Shift B',  'Shift C' UNION ALL
  SELECT '2020-04-03', 'Shift A', 'Shift B',  'Shift C' 
)
SELECT `date`,
  SPLIT(kv, ':')[OFFSET(0)] id_name,
  SPLIT(kv, ':')[OFFSET(1)] id
FROM `project.dataset.table` t,
UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), r'[{}"]', ''))) kv
WHERE SPLIT(kv, ':')[OFFSET(0)] != 'date'
结果是

Row date        id_name id   
1   2020-04-01  ldap1   Shift A  
2   2020-04-01  ldap2   Shift B  
3   2020-04-01  ldap3   Shift C  
4   2020-04-02  ldap1   Shift A  
5   2020-04-02  ldap2   Shift B  
6   2020-04-02  ldap3   Shift C  
7   2020-04-03  ldap1   Shift A  
8   2020-04-03  ldap2   Shift B  
9   2020-04-03  ldap3   Shift C     
以上查询可以进一步重构(取决于您的喜好)


这一个避免了多余的部分和稍微少一些冗长的

对不起,伙计们。我对这一点是新的,似乎上面的文本格式不正确。基本上我得到的结果是我所需要的,但问题是我需要重复400次这个过程。别担心,我们一直都在这样做。按照列命名模式,然后使用loo和预共享语句在存储过程中进行命名。否则你就得把柱子的名字从桌子上拿出来,在上面绕一圈。工作完美。谢谢你。我是新来的,所以我不知道这个选项。嗨,米哈伊尔,我不确定我是否必须提出一个新问题,或者你是否可以直接帮助我。基本上,我的标题位于第2行(从1开始计算):日期id\u名称id。有什么主意吗?我如何不用第1行,而是切换到第2行作为标题?我想偏移1行,但不起作用
Row date        id_name id   
1   2020-04-01  ldap1   Shift A  
2   2020-04-01  ldap2   Shift B  
3   2020-04-01  ldap3   Shift C  
4   2020-04-02  ldap1   Shift A  
5   2020-04-02  ldap2   Shift B  
6   2020-04-02  ldap3   Shift C  
7   2020-04-03  ldap1   Shift A  
8   2020-04-03  ldap2   Shift B  
9   2020-04-03  ldap3   Shift C     
#standardSQL
SELECT `date`, id_name, id
FROM `project.dataset.table` t,
UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), r'[{}"]', ''))) kv,
UNNEST([STRUCT(SPLIT(kv, ':')[OFFSET(0)] AS id_name, SPLIT(kv, ':')[OFFSET(1)] AS id)])
WHERE id_name != 'date'