【问题标题】:SQL Case When Query Count Else Statement Values查询计数 Else 语句值时的 SQL 案例
【发布时间】:2019-08-07 01:45:13
【问题描述】:

在我的查询中,我有多个 Case When 子句,其中一个表中的唯一数字字符串将指示输出中的唯一字符串/句子值。我目前的问题是我的 Case When 输出正在处理输出中的总计数,但是由于存在多个唯一字符串,这些字符串不在第一个表中,而在第二个表中存在,应该在 else 语句中总计为一个总数,每个计数都在自己的行中。

我尝试在查询结束时对 GROUP BY 子句执行 ROLLUP,但没有得到我想要的预期输出。

这是我现在正在使用的:

SELECT 
  F.Identifier, F.Videogame, F.Developer,
CASE WHEN S.String='1581' THEN 'Made by billy'
     WHEN S.String='1903' THEN 'Made by bob'
     WHEN S.String='5849' THEN 'Made by lilly'
     ELSE 'worked on by someone else' END AS Final_Name,
     COUNT(distinct S.User_ID) as Count
FROM 
  table1 as F
JOIN 
  table2 as S
ON
  F.Identifier=S.Identifier
GROUP BY
  F.Identifier, F.Videogame, F.Developer, S.String

这是我目前得到的输出:

abcd | red dead | company1 | worked on by someone else | 1
abcd | red dead | company1 | Made by billy             | 1
defg | halo 3   | company2 | Made by bob               | 1
defg | halo 3   | company2 | worked on by someone else | 1
defg | halo 3   | company2 | worked on by someone else | 1
hijk | fortnite | company3 | Made by lilly             | 1

这是我想要实现的输出:

abcd | red dead | company1 | worked on by someone else | 1
abcd | red dead | company1 | Made by billy             | 1
defg | halo 3   | company2 | Made by bob               | 1
defg | halo 3   | company2 | worked on by someone else | 2
hijk | fortnite | company3 | Made by lilly             | 1

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT F.Identifier, F.Videogame, F.Developer,
    CASE WHEN S.String='1581' THEN 'Made by billy'
         WHEN S.String='1903' THEN 'Made by bob'
         WHEN S.String='5849' THEN 'Made by lilly'
         ELSE 'worked on by someone else' END AS Final_Name,
         COUNT(DISTINCT S.User_ID) AS COUNT
    FROM `project.dataset.table1` AS F
    JOIN `project.dataset.table2` AS S
    ON F.Identifier=S.Identifier
    GROUP BY F.Identifier, F.Videogame, F.Developer, Final_Name 
    

    如您所见,唯一的解决方法是在最后一行 - 您需要使用 S.String 而不是 Final_Name

    因此,如果将上述应用于您问题中的采样数据 - 结果是

    Row Identifier  Videogame   Developer   Final_Name                  Count    
    1   abcd        red dead    company1    worked on by someone else   1    
    2   abcd        red dead    company1    Made by billy               1    
    3   defg        halo 3      company2    Made by bob                 1    
    4   defg        halo 3      company2    worked on by someone else   2    
    5   hijk        fortnite    company3    Made by lilly               1    
    

    【讨论】:

    • 非常感谢您的帮助!我想知道您是否也可以看看我刚刚发布的问题。我真的很感激!
    • 当然。很快就会检查它。同时考虑投票给答案,如果还没有:o)
    【解决方案2】:

    这就是你需要的。

    SELECT 
      F.Identifier, F.Videogame, F.Developer,
    CASE WHEN F.String='1581' THEN 'Made by billy'
         WHEN F.String='1903' THEN 'Made by bob'
         WHEN F.String='5849' THEN 'Made by lilly'
         ELSE 'worked on by someone else' END AS Final_Name,
         S.cnt as Count
    FROM 
      table1 as F
    JOIN 
      (select a.Identifier, b.Developer, count(1) cnt from table2  a
         join table1 b on b.Identifier = a.Identifier
        Group by String, b.Developer) as S
        ON
          F.Identifier=S.Identifier and S.Developer = F.Developer
    

    【讨论】:

      猜你喜欢
      • 2014-12-03
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      相关资源
      最近更新 更多