【问题标题】:Add Date Range to SQL Query将日期范围添加到 SQL 查询
【发布时间】:2010-11-25 16:07:57
【问题描述】:

我有以下查询,它返回针对特定公司(我们集团中有多家公司)的供应商的采购订单总价值。

我想使用 poheader.orderdate 添加日期范围,但由于我没有编写此查询,而且它比我习惯的要复杂一些,我不确定在哪里添加此子句。

任何建议将不胜感激。

SELECT  vendor.Vendorid AS 'ID', 
         vendor.name AS 'Name', 
        Total 
FROM    vendor LEFT JOIN 
        (
            select  sum (podetail.orderqty * podetail.unitcost) AS Total, 
                    podetail.VendorNum, 
                    podetail.Company 
            from    podetail 
            where   exists  (
                                select  1 
                                from    poHeader 
                                where   poHeader.OrderNum = podetail.OrderNum 
                                and     poHeader.ApprovalStatus = 'A'
                            ) 
            and     exists  (
                                select  1 
                                from    vendor 
                                WHERE   vendor.company = 'MyCompany' 
                                and     vendor.VendorNum = podetail.VendorNum 
                                and     vendor.Company = podetail.Company
                            ) 
            group by    podetail.VendorNum, 
                        podetail.Company
        ) OD    ON  vendor.Vendornum = OD.Vendornum   
                and vendor.Company = OD.Company 
WHERE   vendor.company = 'MyCompany' 
ORDER BY    vendor.name

【问题讨论】:

    标签: sql


    【解决方案1】:

    好的,一旦格式化,它看起来就没有那么可怕了,是吗?

    现在您可以看到 where 子句的放置位置了吗?

    类似

    SELECT  vendor.Vendorid AS 'ID', 
            vendor.name AS 'Name', 
            Total 
    FROM    vendor LEFT JOIN 
            (
                select  sum (podetail.orderqty * podetail.unitcost) AS Total, 
                        podetail.VendorNum, 
                        podetail.Company 
                from    podetail 
                where   exists  (
                                    select  1 
                                    from    poHeader 
                                    where   poHeader.OrderNum = podetail.OrderNum 
                                    and     poHeader.ApprovalStatus = 'A'
                                    /*-------PLACE THE Date Range Check HERE------*/
                                    AND     poheader.orderdate BETWEEN @StartDate AND @EndDate
                                ) 
                and     exists  (
                                    select  1 
                                    from    vendor 
                                    WHERE   vendor.company = 'MyCompany' 
                                    and     vendor.VendorNum = podetail.VendorNum 
                                    and     vendor.Company = podetail.Company
                                ) 
                group by    podetail.VendorNum, 
                            podetail.Company
            ) OD    ON  vendor.Vendornum = OD.Vendornum   
                    and vendor.Company = OD.Company 
    WHERE   vendor.company = 'MyCompany' 
    ORDER BY    vendor.name
    

    【讨论】:

    • 这当然让我更容易理解,谢谢!
    • 我已尝试添加 AND poheader.orderdate BETWEEN '2010-11-24' AND 2010-11-25`,但查询返回的 totals 与添加日期范围之前相同。任何想法为什么会发生这种情况?
    • 这可能是因为sum (podetail.orderqty * podetail.unitcost) 在第一个where exists 语句之外,所以这不起作用?
    【解决方案2】:

    我假设您所说的“添加日期范围”是什么意思。我假设您要过滤掉特定范围内的结果:

     SELECT vendor.Vendorid AS 'ID', vendor.name AS 'Name', Total
    FROM vendor 
    LEFT JOIN (select sum (podetail.orderqty * podetail.unitcost) AS Total, podetail.VendorNum, podetail.Company 
       from podetail 
       where exists
        (select 1 
        from poHeader 
        where poHeader.OrderNum = podetail.OrderNum and poHeader.ApprovalStatus = 'A') 
    /*this line*/ and convert(varchar(8),poHeader.orderdate,112) between '20100101' and '20101231' 
       and exists 
        (select 1 from vendor 
        WHERE vendor.company = 'MyCompany' 
        and vendor.VendorNum = podetail.VendorNum 
        and vendor.Company = podetail.Company) 
       group by podetail.VendorNum, podetail.Company) OD 
      ON vendor.Vendornum = OD.Vendornum  
      and vendor.Company = OD.Company
    WHERE vendor.company = 'MyCompany'
    ORDER BY vendor.name
    

    为了便于阅读,我已重新格式化。

    我也转换为 varchar(8),但指定范围的参数可以是日期时间:

    and poHeader.orderdate between getdate()-10 and getdate() 
    

    【讨论】:

    • varchar 转换是个好主意,James,谢谢。我在上面使用了 asstander 的版本,但添加了一条评论,因为即使使用日期过滤器,我仍然得到相同的值。
    • 不用担心。很高兴有帮助。您现在获得了 +15 代表,因此您可以开始投票了 ;-)
    【解决方案3】:

    看起来第一个exists子句应该修改如下:

    (select 1 from poHeader where poHeader.OrderNum = podetail.OrderNum and poHeader.ApprovalStatus = 'A' and poheader.orderdate BETWEEN 'start_date' AND 'end_date's)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多