获取行数基于价值从另一列列(Getting rowcount for a column based

2019-11-03 23:42发布

我有两个表,T1和T2。

T1与下面的列: Id, TypeofValue, Year, value

Typeofvalue可以有2个值

1 -表示Actual

2 -表示Target

T2随着下列柱:NoOfRecordsToDisplay

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

然而,渔获量:

  1. 有时目标值可能不存在了一年
  2. 我需要得到NoOfRecordsToDisplay实际(要显示的记录来自T2的数量)的基础上,只对目标的最后记录

例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

Answer 1:

OK,所以如果我理解正确的话,你要行的总数,其中TypeOfValue = 2,新年是最高的n个值,其中TypeOfValue = 1,对于给定的Id

这应该是:

DECLARE @Id int, @NoOfRecordsToDisplay int

SET @Id = 123
SET @NoOfRecordsToDisplay = 3

SELECT COUNT(*) FROM myTable
WHERE
  TypeofValue = 2
  AND Id = @Id
  AND [Year] IN ( SELECT TOP(@NoOfRecordsToDisplay) [Year] FROM myTable
              WHERE TypeofValue = 1 AND Id = @Id
              ORDER BY [Year] DESC)

在实践中,你可能会想创建这个与@Id一个存储过程作为输入参数。 @NoOfRecordsToDisplay既可以过,或从其他表中选择一个参数 - 我仍然对这个不是100%清楚你的问题。

更新SQL小提琴这里: http://sqlfiddle.com/#!3/87b0c/2

编辑:忘记了ORDER BY的子查询!

编辑2:更新查询和SQL小提琴基于更新的问题。



Answer 2:

SQL和等这些查询,了解解决问题的算法或方法的问题和想象力是太重要,对你想要的东西的基础:

我需要获得实际的最新3个值的基础上,只有最后3个记录目标

你需要有拖车步骤:

1.determine近3年来的实际值:

SELECT TOP 3 [Year]
FROM Your_Table
WHERE Typeofvalue = 1 
ORDER BY [Year] DESC

2.count其自身多年在上面查询目标值的记录:

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


Answer 3:

您可以选择的最后三个项目的实际和相应的目标项目加入,再算上非空值:

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


文章来源: Getting rowcount for a column based on values from another column