Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008 - Fatal编程技术网

SQL Server老化总数不匹配

SQL Server老化总数不匹配,sql,sql-server-2008,Sql,Sql Server 2008,我有一个账龄查询,它按12个月、24个月和36个月的间隔对购买的物品数量及其成本进行账龄计算。该查询运行得很好,但是我的总计与用于查找某个特定供应商的总计的单个查询相比,没有加起来 见下文 SELECT s.SupplierNumber as Supplier_Number , s.suppliername as Supplier_Name , i.supplierpartnum as Part_No , SUBSTRING(e.account_code,1,5

我有一个账龄查询,它按12个月、24个月和36个月的间隔对购买的物品数量及其成本进行账龄计算。该查询运行得很好,但是我的总计与用于查找某个特定供应商的总计的单个查询相比,没有加起来

见下文

    SELECT s.SupplierNumber as Supplier_Number 
    , s.suppliername as Supplier_Name
    , i.supplierpartnum as Part_No
    , SUBSTRING(e.account_code,1,5)/*+'-'+RIGHT(e.account_code,7)*/ as Account_Code
    , CASE WHEN e.reference_code = ''
        THEN 'NOREF'
        ELSE reference_code
        END as Reference_Code
    , i.Commodity
    , i.ShortDscrptn as Part_Desc
    , i.unitofmeasure as UOM
    , i.unitprice as Unit_Price
, CASE WHEN h.OrderDate >= '2012-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN COUNT(i.Quantity)
        ELSE 0 END as Annual_Qty_12
, CASE WHEN h.OrderDate >= '2011-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN COUNT(i.Quantity)
        ELSE 0 END as Annual_Qty_24 
, CASE WHEN h.OrderDate >= '2010-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN COUNT(i.Quantity)
        ELSE 0 END as Annual_Qty_36 
, CASE WHEN h.OrderDate >= '2012-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN SUM(i.UnitPrice) 
        ELSE 0 END as  Annual_Spend_12          
, CASE WHEN h.OrderDate >= '2011-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN SUM(i.UnitPrice) 
        ELSE 0 END as  Annual_Spend_24  
, CASE WHEN h.OrderDate >= '2010-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN SUM(i.UnitPrice) 
        ELSE 0 END as  Annual_Spend_36  
FROM ekp.dbo.SUPPLIER s   
JOIN ekp.dbo.ORDERHEADER h
    ON s.SupplierID = h.SupplierID
JOIN ekp.dbo.ORDERITEM i
    ON h.OrderID = i.OrderID
JOIN mgnt.dbo.ematch e
    ON h.PONumber = e.po_ctrl_num
    AND i.LineNumber = e.po_sequence_id
WHERE h.OrderDate >= '2010-01-01'
AND h.OrderDate <= '2012-12-31' 
GROUP BY s.SupplierNumber, s.SupplierName, i.SupplierPartNum,  e.account_code
, i.Commodity, i.UnitOfMeasure, i.UnitPrice, i.ShortDscrptn, h.OrderDate
, e.reference_code
上面这个查询的总数总是远远高于上面的查询。我还对整个聚合进行了汇总和计数,但它也不匹配,实际上,它生成的结果与顶部查询相同:

    , COUNT(CASE WHEN h.OrderDate >= '2012-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN i.Quantity
        ELSE 0 END) as Annual_Qty_12
, COUNT(CASE WHEN h.OrderDate >= '2011-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN i.Quantity
        ELSE 0 END) as Annual_Qty_24 
, COUNT(CASE WHEN h.OrderDate >= '2010-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN i.Quantity
        ELSE 0 END) as Annual_Qty_36 
, SUM(CASE WHEN h.OrderDate >= '2012-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN i.UnitPrice 
        ELSE 0 END) as  Annual_Spend_12         
, SUM(CASE WHEN h.OrderDate >= '2011-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN i.UnitPrice 
        ELSE 0 END) as  Annual_Spend_24 
, SUM(CASE WHEN h.OrderDate >= '2010-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN i.UnitPrice 
        ELSE 0 END) as  Annual_Spend_36
,计数(h.OrderDate>=“2012-01-01”时的情况)
而h.OrderDate='2011-01-01'
而h.OrderDate='2010-01-01'
而h.OrderDate='2012-01-01'
而h.OrderDate='2011-01-01'
而h.OrderDate='2010-01-01'

而h.OrderDate我猜测试是错误的:第一次查询时,您在Excel中的值相加是错误的。以下是在Excel中相加值的三种有效方法:

  • 筛选值并突出显示列。Excel将在选择单元格(Excel 2007及更高版本)中添加值
  • 使用“sumif()”或“sum({})”添加给定供应商的总计
  • 使用数据透视表

分组依据的结果不一定要排序。它们看起来可能已排序,但仍然可能未排序。进行聚合的一种方法是对数据进行排序,然后选择结果。但是,还有其他方法,例如哈希聚合。而且,在多线程环境中,您不知道哪个线程将返回值以什么顺序发布。

您可以发布一些示例数据吗?我可以看到有几个地方可能会将其丢弃,但这实际上取决于您的数据的性质……查询之间的聚合深度不同。从顶部删除“选择”和“分组依据”中除“供应商编号”之外的所有内容,然后查看其总数。此外,您可以可以轻松地将其更改为动态SQL,这样您就不必硬编码日期,也不需要每年进行存储过程维护。以下是当前输出:@PuroRock…我指的是SupplierNumber--where中使用的变量。而且,不,
group by
不需要(必要)对结果进行排序。如果希望结果按特定顺序排列,则需要使用
orderby
子句。
    , COUNT(CASE WHEN h.OrderDate >= '2012-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN i.Quantity
        ELSE 0 END) as Annual_Qty_12
, COUNT(CASE WHEN h.OrderDate >= '2011-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN i.Quantity
        ELSE 0 END) as Annual_Qty_24 
, COUNT(CASE WHEN h.OrderDate >= '2010-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN i.Quantity
        ELSE 0 END) as Annual_Qty_36 
, SUM(CASE WHEN h.OrderDate >= '2012-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN i.UnitPrice 
        ELSE 0 END) as  Annual_Spend_12         
, SUM(CASE WHEN h.OrderDate >= '2011-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN i.UnitPrice 
        ELSE 0 END) as  Annual_Spend_24 
, SUM(CASE WHEN h.OrderDate >= '2010-01-01'
        AND h.OrderDate <= '2012-12-31'
        THEN i.UnitPrice 
        ELSE 0 END) as  Annual_Spend_36