【问题标题】:(ORDER BY CASE WHEN) ordering by subquery(ORDER BY CASE WHEN) 按子查询排序
【发布时间】:2014-02-06 05:00:07
【问题描述】:

我需要按 int 列升序对结果进行排序,但我只想获取带数字的行 (0...10000),但默认排序会在数字之前为我提供此列的空值行。我用谷歌搜索了将带有 null 的行设置为排序末尾(毕竟是数字)的解决方案,它看起来像

SELECT ProductName
FROM Products
ORDER BY
  CASE WHEN Position is null THEN 1 ELSE 0 END,
  Position

所以我的查询看起来像:

SELECT  c.CompanyId, c.CompanyName, c.CompanyCategoryId, cc.CompanyCategoryName, c.HQCountryISO, c.CrunchBaseUrl,c.AngelListUrl, 
(SELECT MAX(mf.NumLikes) FROM MeasurementFacebook mf
JOIN FacebookAccount f ON f.CompanyId = c.CompanyId
WHERE f.FacebookAccountId in (mf.FacebookAccountId)) as Likes,
(SELECT MAX(mt.NumFollowers) FROM MeasurementTwitter mt
JOIN TwitterAccount t ON t.CompanyId = c.CompanyId
WHERE t.TwitterAccountId in (mt.TwitterAccountId)) as Followers,
(SELECT MAX(ma.AlexaRanking) FROM MeasurementAlexa ma
JOIN Website w ON w.CompanyId = c.CompanyId
WHERE w.WebsiteId in (ma.WebsiteId)) as AlexaRank
FROM Company c 
JOIN CompanyCategory cc ON c.CompanyCategoryId = cc.CompanyCategoryId 
WHERE c.HQCountryISO =  'FRA' 
ORDER BY CASE  WHEN AlexaRank IS NULL THEN 1 ELSE 0 END, AlexaRank 
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY 

如您所见,AlexaRank 是第三个子查询的结果,我想按此列排序结果。但我有一个错误,上面写着:

Msg 207, Level 16, State 1, Line 14
Invalid column name 'AlexaRank'.

我做错了什么?谢谢

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    虽然您可以在 ORDER BY 子句中使用别名,但您不能在表达式中使用别名,最简单的解决方案是将其放在 cte/子查询中:

    ;WITH cte AS (SELECT  c.CompanyId
                          , c.CompanyName
                          , c.CompanyCategoryId
                          , cc.CompanyCategoryName
                          , c.HQCountryISO
                          , c.CrunchBaseUrl
                          ,c.AngelListUrl
                          ,(SELECT MAX(mf.NumLikes) 
                            FROM MeasurementFacebook mf
                            JOIN FacebookAccount f ON f.CompanyId = c.CompanyId
                            WHERE f.FacebookAccountId in (mf.FacebookAccountId)) as Likes
                          ,(SELECT MAX(mt.NumFollowers) 
                            FROM MeasurementTwitter mt
                            JOIN TwitterAccount t ON t.CompanyId = c.CompanyId
                            WHERE t.TwitterAccountId in (mt.TwitterAccountId)) as Followers
                          ,(SELECT MAX(ma.AlexaRanking) 
                            FROM MeasurementAlexa ma
                            JOIN Website w ON w.CompanyId = c.CompanyId
                            WHERE w.WebsiteId in (ma.WebsiteId)) as AlexaRank
                    FROM Company c 
                    JOIN CompanyCategory cc ON c.CompanyCategoryId = cc.CompanyCategoryId 
                    WHERE c.HQCountryISO =  'FRA')
    SELECT * 
    FROM  cte
    ORDER BY CASE WHEN AlexaRank IS NULL THEN 1 ELSE 0 END, AlexaRank 
    OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY 
    

    【讨论】:

      【解决方案2】:

      非常低效的代码,但您可以执行以下操作。基本上将您的初始查询包装在一个公用表表达式中,这样您就不需要在您的 order by 中重写您的第三个子选择。

      SELECT * FROM (
      SELECT c.companyid, 
         c.companyname, 
         c.companycategoryid, 
         cc.companycategoryname, 
         c.hqcountryiso, 
         c.crunchbaseurl, 
         c.angellisturl, 
         (SELECT Max(mf.numlikes) 
          FROM   measurementfacebook mf 
                 JOIN facebookaccount f 
                   ON f.companyid = c.companyid 
          WHERE  f.facebookaccountid IN ( mf.facebookaccountid )) AS Likes, 
         (SELECT Max(mt.numfollowers) 
          FROM   measurementtwitter mt 
                 JOIN twitteraccount t 
                   ON t.companyid = c.companyid 
          WHERE  t.twitteraccountid IN ( mt.twitteraccountid ))   AS Followers, 
         (SELECT Max(ma.alexaranking) 
          FROM   measurementalexa ma 
                 JOIN website w 
                   ON w.companyid = c.companyid 
          WHERE  w.websiteid IN ( ma.websiteid ))                 AS AlexaRank 
      FROM   company c 
         JOIN companycategory cc 
           ON c.companycategoryid = cc.companycategoryid 
      WHERE  c.hqcountryiso = 'FRA' ) Q
      ORDER  BY CASE 
              WHEN Q.AlexaRank IS NULL THEN 1 
              ELSE 0 
            END, 
            Q.AlexaRank 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-10
        • 2019-03-27
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多