0

这是我的返回数据结构的简单示例:

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列为真,我需要反转比例。所以规模将是:

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

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

4

2 回答 2

1

所以我可能会误解;如果是这样,我道歉。但我的理解是,您希望通过绝对值获得计数......所以如果我有五行的值为 1 和五行的值为 5(反转),我想对于值为 1,显示计数为 10。

假设是这种情况并且你有一个字符串而不是一个 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.

于 2013-03-12T20:22:09.800 回答
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
于 2013-03-12T20:07:39.043 回答