Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-比较多个表中的有序列_Sql_Sql Server_Common Table Expression - Fatal编程技术网

SQL Server-比较多个表中的有序列

SQL Server-比较多个表中的有序列,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,我有三个表,其中包含项目观察结果,每个表都有以下列: 表2015:项目名称、项目计数 表2014:项目名称、项目计数 表2013:ItemName、ItemCount 我想从Table2015中获得每个ItemName的3个最高计数,如果Table2015中该ItemName的最高计数大于Table2014和Table2013中该ItemName的最高计数,则在报告中标记该行 我要从Table2015中获得高计数,我不确定如何继续获得我需要的。我是否应该将另一个CTE与其他表一起使用,并以某种方

我有三个表,其中包含项目观察结果,每个表都有以下列: 表2015:项目名称、项目计数 表2014:项目名称、项目计数 表2013:ItemName、ItemCount

我想从Table2015中获得每个ItemName的3个最高计数,如果Table2015中该ItemName的最高计数大于Table2014和Table2013中该ItemName的最高计数,则在报告中标记该行

我要从Table2015中获得高计数,我不确定如何继续获得我需要的。我是否应该将另一个CTE与其他表一起使用,并以某种方式将其加入最终选择

with counts as (
select e.ItemName, e.ItemCount, row_number() over (partition by e.ItemName order by cast(e.ItemCount as int) desc) as rk
from Table2015 e where e.ItemCount <> 'X')

select s.*, 
from counts s
where s.rk<4
order by s.ItemName,s.rk;

只要项目名称在不同年份之间保持一致,就只需要连接到其他表

with counts as (
select e.ItemName, e.ItemCount, row_number() over (partition by e.ItemName order by cast(e.ItemCount as int) desc) as rk
from Table2015 e where e.ItemCount <> 'X')

select s.ItemName
   , s.ItemCount
   , CASE WHEN CAST(t15.ItemCount AS INT) > ISNULL(CAST(t14.ItemCount AS INT), 0) THEN 1 ELSE 0 END AS GreaterThan2014
   , CASE WHEN CAST(t15.ItemCount AS INT) > ISNULL(CAST(t13.ItemCount AS INT), 0) THEN 1 ELSE 0 END AS GreaterThan2013
from counts s
    inner join counts t15 ON s.ItemName = t15.ItemName and t15.rk = 1
    left join (
        select ItemName, MAX(CASE WHEN IsNumeric(ItemCount) = 1 THEN CAST(ItemCount AS INT) ELSE -1 END)
        from Table2014 
        where ItemCount <> 'X' 
        group by ItemName
   ) t14 on s.ItemName = t14.ItemName 
    left join (
        select ItemName, MAX(CASE WHEN IsNumeric(ItemCount) = 1 THEN CAST(ItemCount AS INT) ELSE -1 END)
        from Table2013
        where ItemCount <> 'X' 
        group by ItemName
   ) t13 on s.ItemName = t13.ItemName 

where s.rk<4
order by s.ItemName,s.rk;

此外,在计数字段中不应该有“X”作为可能。如果您要计算某个项目,它应该键入一个INT。

这看起来已经很复杂了,您不会选择前三名ItemName,ItemCount from counts order by ItemCount desc work吗?这不只是对Table2014和Table2013中的所有项目进行逐行比较,而不是比较最大计数吗?我想我需要找出每个表中每个项目的最大数量。我误解了这个问题。它已更新以反映您的要求。在将varchar值“X”转换为数据类型int时,给了我一个Msg 245,级别16,状态1,第1行转换失败。我不确定哪个强制转换实际上失败。是的,您不应该在计数列中包含X。为什么不将它们更改为NULL?不幸的是,在数据源中,X的逻辑含义不同于NULL——这意味着有一些项,但我们不确定有多少项。