2016-09-30 57 views
0

我有两列,它们是按另一列中的值计算的。计算列上的自定义排序

CASE 
    WHEN ACT.TotalScore > 850 THEN 'Cok Basarili' 
    WHEN ACT.TotalScore <= 850 AND ACT.TotalScore > 700 THEN 'Basarili' 
    ELSE 'Basarisiz' END as Basari, 
    CASE 
    WHEN ACT.TotalScore > 850 THEN 'rgba(123,192,67,1)' 
    WHEN ACT.TotalScore <= 850 AND ACT.TotalScore > 700 THEN 'rgba(253,244,152,1)' 
    ELSE 'rgba(243,119,54,1)' END as Renk 

他们计算成功,并根据他们的点实际分配一种颜色。

ON GROUP BY我用同样的CASE WHEN

总产量(与其他的选择元素ADN where子句等,并没有ORDER BY)

+---------------+--------------+---------------------+ 
| DenetimSayisi | Basari |  Renk   | 
+---------------+--------------+---------------------+ 
|   35 | Cok Basarili | rgba(123,192,67,1) | 
|   60 | Basarisiz | rgba(243,119,54,1) | 
|   29 | Basarili  | rgba(253,244,152,1) | 
+---------------+--------------+---------------------+ 

我想根据做出的客户订单'伯萨里' 列,并试图此

ORDER BY CASE 
    WHEN ACT.TotalScore > 850 THEN 2 
    WHEN ACT.TotalScore <= 850 AND ACT.TotalScore > 700 THEN 1 
    ELSE 3 END 

给出该错误

Msg 8127, Level 16, State 1, Line 36 
Column "Activity.TotalScore" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause. 
Msg 8127, Level 16, State 1, Line 37 
Column "Activity.TotalScore" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause. 
Msg 8127, Level 16, State 1, Line 37 
Column "Activity.TotalScore" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause. 

我不知道还有什么我可以尝试或我该如何解决这个问题。

+0

你能显示你所有的查询吗? – gofr1

回答

1

在子查询中计算您的订单,并在其之外订购。

SELECT 
    * 
FROM 
(
    SELECT 
     CASE 
     WHEN ACT.TotalScore > 850 THEN 'Cok Basarili' 
     WHEN ACT.TotalScore <= 850 AND ACT.TotalScore > 700 THEN 'Basarili' 
     ELSE 'Basarisiz' END as Basari, 
     CASE 
     WHEN ACT.TotalScore > 850 THEN 'rgba(123,192,67,1)' 
     WHEN ACT.TotalScore <= 850 AND ACT.TotalScore > 700 THEN 'rgba(253,244,152,1)' 
     ELSE 'rgba(243,119,54,1)' END as Renk 

     OrderByField=CASE 
     WHEN ACT.TotalScore > 850 THEN 2 
     WHEN ACT.TotalScore <= 850 AND ACT.TotalScore > 700 THEN 1 
     ELSE 3 END 
    FROM 
     Table 
) 
AS A 
ORDER BY 
    A.OrderByField 
+0

谢谢,工作很好 –

1

你必须把你的新编号逻辑放在组中。制作一个新的专栏并按顺序排列。

SELECT DenetimSayisi 
    , CASE 
     WHEN ACT.TotalScore > 850 
      THEN 'Cok Basarili' 
     WHEN ACT.TotalScore <= 850 
      AND ACT.TotalScore > 700 
      THEN 'Basarili' 
     ELSE 'Basarisiz' 
     END AS Basari 
    , CASE 
     WHEN ACT.TotalScore > 850 
      THEN 'rgba(123,192,67,1)' 
     WHEN ACT.TotalScore <= 850 
      AND ACT.TotalScore > 700 
      THEN 'rgba(253,244,152,1)' 
     ELSE 'rgba(243,119,54,1)' 
     END AS Renk 
    , CASE 
     WHEN ACT.TotalScore > 850 
      THEN 2 
     WHEN ACT.TotalScore <= 850 
      AND ACT.TotalScore > 700 
      THEN 1 
     ELSE 3 
     END AS newColumn 
FROM yourtable 
ORDER BY CASE 
     WHEN ACT.TotalScore > 850 
      THEN 2 
     WHEN ACT.TotalScore <= 850 
      AND ACT.TotalScore > 700 
      THEN 1 
     ELSE 3 
     END 

如果你不想竟查询新的排序列,你可以使用一个CTE掉落。

;WITH cte AS (
SELECT DenetimSayisi 
    , CASE 
     WHEN ACT.TotalScore > 850 
      THEN 'Cok Basarili' 
     WHEN ACT.TotalScore <= 850 
      AND ACT.TotalScore > 700 
      THEN 'Basarili' 
     ELSE 'Basarisiz' 
     END AS Basari 
    , CASE 
     WHEN ACT.TotalScore > 850 
      THEN 'rgba(123,192,67,1)' 
     WHEN ACT.TotalScore <= 850 
      AND ACT.TotalScore > 700 
      THEN 'rgba(253,244,152,1)' 
     ELSE 'rgba(243,119,54,1)' 
     END AS Renk 
    , CASE 
     WHEN ACT.TotalScore > 850 
      THEN 2 
     WHEN ACT.TotalScore <= 850 
      AND ACT.TotalScore > 700 
      THEN 1 
     ELSE 3 
     END AS newColumn 
FROM yourtable 
ORDER BY CASE 
     WHEN ACT.TotalScore > 850 
      THEN 2 
     WHEN ACT.TotalScore <= 850 
      AND ACT.TotalScore > 700 
      THEN 1 
     ELSE 3 
     END 
) 
Select DenetimSayisi, basari, renk from cte