计算列

时间:2016-09-30 14:44:41

标签: sql-server

我有两列,由另一列中的值计算。

    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

总输出(其他选择元素和子句等,没有顺序)

+---------------+--------------+---------------------+
| 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) |
+---------------+--------------+---------------------+

我想根据'Basari'专栏制作一个自定义订单,然后尝试了这个

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.

我不知道我还能尝试什么,或者我该如何解决这个问题。

2 个答案:

答案 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

答案 1 :(得分:1)

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

select id, least(val1, val2, <etc>)
from myTable
where mid=1