Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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 如果可能,最小值/最大值为空的布尔表达式?_Sql_Tsql_Sql Server 2005_Boolean - Fatal编程技术网

Sql 如果可能,最小值/最大值为空的布尔表达式?

Sql 如果可能,最小值/最大值为空的布尔表达式?,sql,tsql,sql-server-2005,boolean,Sql,Tsql,Sql Server 2005,Boolean,是否可以将带有max或min的布尔表达式放入nullif()语句中 比如说 select min(a) as b ---grabbing first value ,max(a) as c --- grabbing last value but could be same as min value, this is the problem ,nullif(min(a), (min(a) = max(a))) ---my idea for a solution that

是否可以将带有max或min的布尔表达式放入nullif()语句中

比如说

select 
    min(a) as b ---grabbing first value
    ,max(a) as  c --- grabbing last value but could be same as min value, this is the problem
    ,nullif(min(a), (min(a) = max(a))) ---my idea for a solution that didnt work
   from table
当字段的值仅出现1次时,尝试删除重复行。我想可能有一种方法可以做到这一点,即先计数,然后剔除所有值超过1的值,但我不确定如何做到这一点。在SQLServer2005上工作,如果可能的话,在t-sql中需要这个,但是在服务器上工作的任何东西都可以

编辑以提供更多信息: 我正在查看订单管理系统中订单的状态历史记录,该系统在每次请求更正时都会使用id进行标记。id是唯一的数字。在该格式1234中,每个orderid都是唯一的,并且在该格式1111111中也是数字的。a代表唯一的修正id。我想看一下顺序,如果一个修正id已经发生了,理想情况下会抓住下一个,如果可能的话会抓住下一个。至少我想要最大值和最小值。我不能只做两列,因为这会将最小值计算两次(使用我的示例),并且不会给出准确的数据

我试图简单地介绍我的示例,但它没有提供足够的信息,以下是更多信息:

SELECT Cast(oi.orderid AS VARCHAR(MAX)) + '.' 
                 + Cast(oi.orderitemid AS VARCHAR(MAX)) AS OrderNumber,
       Min(oici.orderitemcorrectionid)                  AS a,
       Max(oici.orderitemcorrectionid)                  AS b
FROM   Orderitems oi
       LEFT JOIN orderitemcorrections oic
         ON oic.orderid = oi.orderid
            AND oic.orderitemid = oi.orderitemid
       LEFT JOIN orderitemcorrectionissues oici
         ON oici.orderitemcorrectionid = oic.orderitemcorrectionid
       LEFT JOIN correctiontypes ct
         ON ct.correctiontypeid = oici.correctiontypeid
GROUP  BY Cast(oi.orderid AS VARCHAR(MAX)) + '.' 
                   + Cast(oi.orderitemid AS VARCHAR(MAX)) 
上述查询的样本表数据:

OrderNumber a   b
1098048.1   1   2
1098210.1   160 160
1098222.1   78  78
1098300.1   31  31
1098408.1   4   4
1098462.1   224 224
1098468.1   602 602
1098492.2   1457 1457
以上是a和b相同的数据 下面是它们的不同之处,但我希望将从a到b的任何重复项都设为空

1100268.1   181 191
1100256.1   306 379
更多数据,未分组以显示行的重复数据。-原始数据样本

OrderNumber orderitemcorrectionid
1098048.1   1
1098048.1   2
1098210.1   160
1098210.1   160

可以通过使用UNION来实现空值化,UNION将删除重复的行。我会这样做

;with tmp AS (
    select
    CAST(oi.orderid as VARCHAR(MAX))+'.'+CAST(oi.orderitemid as VARCHAR(MAX)) as OrderNumber
    ,min(oici.orderitemcorrectionid) as a
    ,max(oici.orderitemcorrectionid) as b

    FROM
    Orderitems oi
    left join orderitemcorrections oic on oic.orderid = oi.orderid and oic.orderitemid = oi.orderitemid
    left join orderitemcorrectionissues oici on oici.orderitemcorrectionid = oic.orderitemcorrectionid
    left join correctiontypes ct on ct.correctiontypeid = oici.correctiontypeid
    GROUP BY 
    CAST(oi.orderid as VARCHAR(MAX))+'.'+CAST(oi.orderitemid as VARCHAR(MAX))
)
select OrderNumber, a
from tmp
union
select OrderNumber, b
from tmp

这将a和b放在不同的行中,Union负责删除重复项。

可能类似于:

SELECT Cast(oi.orderid AS VARCHAR(MAX)) + '.' 
                 + Cast(oi.orderitemid AS VARCHAR(MAX)) AS OrderNumber,
       COALESCE(Min(oici.orderitemcorrectionid),Max(oici.orderitemcorrectionid),0) AS a,
       COALESCE(Max(oici.orderitemcorrectionid),Min(oici.orderitemcorrectionid),0) AS b
FROM   Orderitems oi
       LEFT JOIN orderitemcorrections oic
         ON oic.orderid = oi.orderid
            AND oic.orderitemid = oi.orderitemid
       LEFT JOIN orderitemcorrectionissues oici
         ON oici.orderitemcorrectionid = oic.orderitemcorrectionid
       LEFT JOIN correctiontypes ct
         ON ct.correctiontypeid = oici.correctiontypeid
GROUP  BY Cast(oi.orderid AS VARCHAR(MAX)) + '.' 
                   + Cast(oi.orderitemid AS VARCHAR(MAX)) 

不过,我可能无法理解,所以请善待我。

你最好解释一下你的根本问题。如果是如何识别重复项,那么请提供一些示例架构/数据。好的,很抱歉缺少信息,我认为这更像是一个语法问题。如果你要提供大约10行虚拟数据并给出该数据的示例结果,我会亲自编辑我的帖子,这可能会让事情变得更清楚。因此,你的最终表(不分组)是原始数据的样子,你想要的结果与你标题为“示例表数据”的表类似除了如果
a=b
之外,b的值应该为空?要修改原始查询,您只需要
当Min(oici.orderitemcorrectionid)Max(oici.orderitemcorrectionid)然后Max(oici.orderitemcorrectionid)时的情况结束为b
在所有这些之后,但看起来您现在有了一些其他选择。这帮助我更接近我所需要的,我在这个查询中有其他问题来获得我所需要的,但这让我克服了一个障碍,谢谢。