【问题标题】:Using CASE in Oracle SQL在 Oracle SQL 中使用 CASE
【发布时间】:2019-12-17 20:55:15
【问题描述】:

想象一下人们在全球范围内访问谷歌网站的次数(ID、姓名、位置、谷歌(varchar)) 我要查询,以便结果显示如下

   Name : No.of times : Location : Google Website

   Joe  :   2         :  Singapore : google.com.sg
   Kim  :   3         :  Japan     : google.com.jp

就我的两分钱.....下面的查询对吗?

 SELECT Name, Count(Name), Location, CASE WHEN Location = 'Singapore' THEN CONCAT('google','.com.sg')
                                     WHEN Location = 'Japan' THEN CONCAT('google','.com.jp')
                                     ELSE google END AS Website
 FROM db1
 GROUP BY Name, Location, Website

因为当我在select语句中添加CASE时,它一直说不是GROUP BY表达式,所以我想检查一下我的理解是否正确......

【问题讨论】:

    标签: sql oracle case


    【解决方案1】:

    您必须在GROUP BY 子句中重复整个CASE 表达式,或者使用子查询。对于后者(不那么冗长)选项:

    WITH cte AS (
        SELECT
            Name,
            Location,
            CASE Location WHEN 'Singapore' THEN CONCAT('google','.com.sg')
                          WHEN 'Japan' THEN CONCAT('google','.com.jp')
                          ELSE google END AS Website
        FROM db1
    )
    
    SELECT Name, Location, Website, COUNT(Name) AS cnt
    FROM cte
    GROUP BY Name, Location, Website;
    

    【讨论】:

      【解决方案2】:

      需要在group by中添加case语句

       SELECT Name, Count(Name), Location, CASE WHEN Location = 'Singapore' THEN CONCAT('google','.com.sg')
                                           WHEN Location = 'Japan' THEN CONCAT('google','.com.jp')
                                           ELSE 'google' END AS Website
       FROM db1
       GROUP BY Name, Location, CASE WHEN Location = 'Singapore' THEN CONCAT('google','.com.sg')
                                           WHEN Location = 'Japan' THEN CONCAT('google','.com.jp')
                                           ELSE 'google' END
      

      【讨论】:

        【解决方案3】:

        其实你的理解是对的,只需要一点点改动。

        您不需要将WEBSITE 添加到group by 表达式中,因为它是基于Location 列的派生列,而GROUP BY 子句中已经存在该列。

        因此,只需从您的 GROUP BY 子句中删除 WEBSITE 即可:

        SELECT
            NAME,
            COUNT(NAME),
            LOCATION,
            CASE
                WHEN LOCATION = 'Singapore' THEN CONCAT('google', '.com.sg')
                WHEN LOCATION = 'Japan'     THEN CONCAT('google', '.com.jp')
                ELSE 'google' -- if this is string then it must be wrapped in the single quotes
            END AS WEBSITE
        FROM
            DB1
        GROUP BY
            NAME,
            LOCATION; --,WEBSITE -- removed WEBSITE rfom GROUP BY clause
        

        干杯!!

        【讨论】:

          【解决方案4】:

          分两步完成:

          1. 派生表中进行聚合 (count())(即子查询,这里命名为 dt.)

          2. 在其结果上应用case 表达式

              SELECT Name, Location,
                     CASE Location WHEN 'Singapore' THEN CONCAT('google','.com.sg')
                                   WHEN 'Japan' THEN CONCAT('google','.com.jp')
                                   ELSE 'google'
                     END AS Website,
                     cnt
              FROM
              (
                  SELECT Name,
                         Location,
                         count(Name) as cnt
                  FROM db1
                  GROUP BY Name, Location
              ) dt
          
          
          

          【讨论】:

            【解决方案5】:

            您的查询很好 - 如果您希望每个位置都有单独的行。

            如果您只想要最多三个位置 - 新加坡、日本和其他任何地方 - 然后从 SELECTGROUP BY 中删除 location 并将 CASE 添加到 GROUP BY 中:

            SELECT Name, Count(Name), 
                   (CASE WHEN Location = 'Singapore' THEN CONCAT('google','.com.sg')
                        WHEN Location = 'Japan' THEN CONCAT('google','.com.jp')
                        ELSE 'google'
                    END) AS Website
            FROM db1
            GROUP BY Name, 
                     (CASE WHEN Location = 'Singapore' THEN CONCAT('google','.com.sg')
                           WHEN Location = 'Japan' THEN CONCAT('google','.com.jp')
                           ELSE 'google'
                      END);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-11-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-10-03
              相关资源
              最近更新 更多