2014-02-05 6 views
1

Мне нужно заказать мои результаты по столбцу int по возрастанию, но я хочу получить только строки с числами (0 ... 10000), но по умолчанию упорядочение дает мне строки с нулевыми значениями для этого столбец перед номерами. Я гугле решение, которое набор строк с нулем в конце заказа (после всех чисел) это выглядит как(ORDER BY CASE WHEN) заказ по подзапросу

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'. 

Что я делаю неправильно? Благодаря

ответ

2

В то время как вы можете использовать псевдоним в предложении 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 
+0

Прохладный! Спасибо! – user1947702

0

Очень неэффективный код, но вы могли бы сделать что-то вроде следующего. В основном оберните свой первоначальный запрос в общем выражении таблицы, чтобы вам не пришлось переписывать свой третий подвыбор в своем заказе.

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