根据另一列的值获取列的rowcount

时间:2015-08-20 00:12:14

标签: sql sql-server-2008

我有两张桌子,T1和T2。

T1包含以下列:Id, TypeofValue, Year, value

Typeofvalue可以有2个值

1 - 表示Actual

2 - 表示Target

T2使用以下列:NoOfRecordsToDisplay

我需要获取与Target对应的Id的记录数(如果存在)。

然而,捕获量是:

  1. 有时目标价值可能一年不存在
  2. 我需要根据NoOfRecordsToDisplay(要显示的记录数量来自T2)获得目标的最后记录
  3. 例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
    

3 个答案:

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