这是一个关于我的返回数据结构的简单示例:
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
我做错了什么?如何应用反向逻辑将反向问题值计数到正确的值?
答案 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