(ORDER BY CASE WHEN) command par sous-requête

Je dois ordonner mes résultats par int ascendant de la colonne, mais je veux get seulement des lignes avec des nombres (0 … 10000) mais l'ordre par défaut me donne des lignes avec des valeurs nulles pour cette colonne avant les nombres. Je googlé la solution qui a mis des lignes avec null dans la fin de la command (après tous les numéros), il ressemble

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

Donc, ma requête ressemble à:

 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 

Comme vous pouvez le voir, AlexaRank est le résultat de la troisième sous-requête, et je veux order le résultat par cette colonne. Mais j'ai une erreur qui dit:

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

Qu'est-ce que je fais mal? Merci

Bien que vous puissiez utiliser un alias dans la clause ORDER BY , vous ne pouvez pas utiliser un alias dans une expression, la solution la plus simple consiste à le replier dans une cte / subquery:

 ;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 

Code très inefficace mais vous pourriez faire quelque chose comme le suivant. Enveloppez votre requête initiale dans une expression de table commune afin de ne pas avoir à réécrire votre 3ème sous-sélection dans votre command.

 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