使用CASE语句重新分配值 - T-SQL

时间:2013-03-12 19:59:14

标签: sql-server tsql case

这是一个关于我的返回数据结构的简单示例:

id | cat id | value | reverse
1  | 1      | 5     | false
2  | 1      | 5     | false
3  | 2      | 2     | true
4  | 2      | 1     | false
5  | 1      | 3     | true

在下面的sql语句中,我试图通过value列获取每个value类型组的计数。如果reverse列为true,我需要反转比例。所以规模如下:

5 = 1
4 = 2
3 = 3
2 = 4
1 = 5

我尝试了以下SQL语句,但似乎没有将反向比例应用于计数,它只是忽略了反向标记:

select value, count(
case reverse
    WHEN false THEN 
        CASE value
        WHEN '5' THEN '1'
        WHEN '4' THEN '2'
        WHEN '3' THEN '3'
        WHEN '2' THEN '4'
        WHEN '1' THEN '5'

    END
    ELSE value
END
)
from table1
group by value

我做错了什么?如何应用反向逻辑将反向问题值计数到正确的值?

2 个答案:

答案 0 :(得分:1)

所以我可能会误解;如果是的话,我道歉。但我的理解是你想要以绝对值得到计数....所以如果我有五行的值为1和五行的值为5(反转),我想要显示值为1的十位数。

假设是这种情况并且你有一个字符串而不是一个int(但是这些值都是整数而不是更复杂的东西:

    ;WITH reversed AS 
    (
        SELECT id, 
            [cat id], 
            CASE WHEN [reverse] = 1 THEN 6 - CAST([value] AS INT) 
                ELSE CAST([value] AS INT) END AS [calcValue]
        FROM table1
    )
    SELECT calcValue, COUNT(id) AS counts
    FROM reversed
    GROUP BY calcValue;

原始计算的部分问题在于,在对其进行分组之前,您没有对原始值执行任何操作,您只需要计算case语句。如果COUNT()中的值不同,则NULL不会有所不同,只要这些值不是{{1}}。

答案 1 :(得分:0)

试试这个:

with data as ( 
  select * from ( values
    (1,1,5,'false'),
    (2,1,5,'false'),
    (3,2,2,'true'),
    (4,2,1,'false'),
    (5,1,3,'true')
    ) data(id,cat,value,reverse)
) 
select 
  id,
  cat,
  value = case when reverse='false' then value else 6-value end
from data

归还:

id          cat         value
----------- ----------- -----------
1           1           5
2           1           5
3           2           4
4           2           1
5           1           3