我有两张桌子,T1和T2。
T1包含以下列:Id, TypeofValue, Year, value
Typeofvalue
可以有2个值
1
- 表示Actual
2
- 表示Target
T2使用以下列:NoOfRecordsToDisplay
我需要获取与Target
对应的Id
的记录数(如果存在)。
然而,捕获量是:
例1: NoOfRecordsToDisplay = 3,ID = 123 下面的数据应该返回3,因为在这种情况下,过去3年的目标有3个非空值-2015,2014,2013
Id TypeofValue Year Value
123 1 2015 55
123 1 2014 56
123 1 2013 57
123 1 2012 58
123 2 2015 50
123 2 2014 50
123 2 2013 50
123 2 2012 50
124 1 2015 55
124 1 2014 56
124 1 2013 57
124 1 2012 58
124 2 2015 50
124 2 2014 50
124 2 2013 50
124 2 2012 50
另一个数据集 - NoOfRecordsToDisplay = 3,ID = 123 以下数据应返回0,因为我们没有过去3年-2015,2014,2013的目标值
Id TypeofValue Year Value
123 1 2015 55
123 1 2014 56
123 1 2013 57
123 1 2012 58
123 2 2012 50
124 1 2015 55
124 1 2014 56
124 1 2013 57
124 1 2012 58
124 2 2012 50
答案 0 :(得分:1)
好的,如果我理解正确,你想要一个行数,其中TypeOfValue = 2,而Year是在顶部的 n 值,其中TypeOfValue = 1,对于给定的{{1} }。
这应该是:
Id
在实践中,您可能希望将其创建为存储过程,并将@Id作为输入参数。 @NoOfRecordsToDisplay也可以是一个参数,也可以从其他表格中选择 - 我仍然没有100%明确你的问题。
在此处更新了SQL小提琴:http://sqlfiddle.com/#!3/87b0c/2
编辑:忘记子查询上的ORDER BY!
编辑2:根据更新的问题更新了查询和SQL小提琴。
答案 1 :(得分:1)
使用SQL和这些查询,根据您的需要,理解解决问题的算法或方法的问题和想象力是非常重要的:
我需要根据最新的3来获得目标的最后3条记录 实际值
你需要有两个步骤:
1.确定过去3年的实际值:
SELECT TOP 3 [Year]
FROM Your_Table
WHERE Typeofvalue = 1
ORDER BY [Year] DESC
2.计算其年份在上述查询中的目标值的记录:
SELECT COUNT(*) FROM Your_Table
WHERE
Typeofvalue = 2
AND
[Year] IN (
SELECT TOP 3 [Year]
FROM Your_Table
WHERE Typeofvalue = 1
ORDER BY [Year] DESC)
您也可以通过加入而不是子查询来实现:
SELECT COUNT(*) FROM Your_Table t
JOIN
(
SELECT TOP 3 [Year]
FROM Your_Table
WHERE Typeofvalue = 1
ORDER BY [Year] DESC
)q
ON T.[Year]=q.[Year]
WHERE t.Typeofvalue=2
答案 2 :(得分:0)
您可以选择最后三个实际项目并加入相应的目标项目,然后计算非空值:
select
count(Id)
from (
select top 3
t2.Id
from
TheTable t1
left join TheTable t2 on t2.Year = t1.Year and t2.TypeofValue = 2
where
t1.TypeofValue = 1
order by
t1.Year desc
) x