Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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_Subquery_Ssrs 2012 - Fatal编程技术网

SQL Server子查询基于另一个子查询不返回任何内容

SQL Server子查询基于另一个子查询不返回任何内容,sql,sql-server,subquery,ssrs-2012,Sql,Sql Server,Subquery,Ssrs 2012,我有两个子查询,其中基于第一个子查询,第二个子查询的结果发生了我不希望发生的变化 这两个查询完全相同,不同于它们用于日期的变量 第一个查询始终正常工作,但第二个查询有时似乎会受到第一个查询的影响 如果在第二个查询之前有第一个查询,那么它们都将返回相同的日期。如果在第一个查询之前有第二个查询,那么它有时什么也不返回 declare @curDate date = DATEADD(week,0,'2016/02/01') declare @shortDate date = DATEADD(week,

我有两个子查询,其中基于第一个子查询,第二个子查询的结果发生了我不希望发生的变化

这两个查询完全相同,不同于它们用于日期的变量

第一个查询始终正常工作,但第二个查询有时似乎会受到第一个查询的影响

如果在第二个查询之前有第一个查询,那么它们都将返回相同的日期。如果在第一个查询之前有第二个查询,那么它有时什么也不返回

declare @curDate date = DATEADD(week,0,'2016/02/01')
declare @shortDate date = DATEADD(week,-2,@curDate)

SELECT -- Select Columns
    quere1.Location,
    quere1.Product,
    quere1.Short,
    MAX( quere1.Date ) [Date],
    MAX( quere1.Volume ) [Volume],
    MAX( quere1.Cost ) [Cost],
    MAX( quere2.Date ) [DateAgo],
    MAX( quere2.Volume ) [VolumeAgo],
    MAX( quere2.Cost ) [CostAgo]
FROM

    (SELECT --subQuery 1
        cst_mac_a.loc [Location],                 --Branch
        cst_mac_a.product [Product],             --Product
        pro_duct.desc4 [Short],
        MAX( cst_mac_a.datecreated ) [Date],  --Date
        MAX( cst_mac_a.ohvol ) [Volume],        --Volume
        MAX( cst_mac_a.ohextcost ) [Cost]     --Cost
    FROM cst_mac as cst_mac_a
        JOIN pro_type ON pro_type.proType = cst_mac_a.proType
        JOIN pro_duct ON pro_duct.proType = cst_mac_a.proType AND pro_duct.product = cst_mac_a.product
    WHERE
        cst_mac_a.protype = 'HW' AND

        cst_mac_a.datecreated in (SELECT MAX( sub.datecreated ) from cst_mac as sub WHERE 
                                    cst_mac_a.product = sub.product AND sub.datecreated <= @curDate) AND

        cst_mac_a.timecreated in (SELECT MAX( sub.timecreated ) from cst_mac as sub WHERE
                                    cst_mac_a.product = sub.product AND sub.datecreated in 
                                                (SELECT MAX( sub2.datecreated ) from cst_mac as sub2 WHERE 
                                                            sub2.datecreated <= @curDate and sub2.product = sub.product)) AND

        cst_mac_a.PROGRESS_RECID in (SELECT MAX( sub.PROGRESS_RECID ) from cst_mac as sub WHERE 
                                    cst_mac_a.product = sub.product AND sub.datecreated in 
                                                (SELECT MAX( sub2.datecreated ) from cst_mac as sub2 WHERE
                                                            sub2.datecreated <= @curDate AND sub2.product = sub.product)) AND

        cst_mac_a.ohvol <> 0 AND
        cst_mac_a.product = 'A4ROUP'
    GROUP BY
        cst_mac_a.loc,
        cst_mac_a.product,
        pro_duct.desc4)
    as quere1

    LEFT OUTER JOIN (SELECT --Basically same code, subquery 2
        cst_mac_a2.loc [Location],                 --Branch
        cst_mac_a2.product [Product],             --Product
        pro_duct.desc4 [Short],
        MAX( cst_mac_a2.datecreated ) [Date],  --Date
        MAX( cst_mac_a2.ohvol ) [Volume],        --Volume
        MAX( cst_mac_a2.ohextcost ) [Cost]     --Cost
    FROM cst_mac as cst_mac_a2
        JOIN pro_type ON pro_type.proType = cst_mac_a2.proType
        JOIN pro_duct ON pro_duct.proType = cst_mac_a2.proType AND pro_duct.product = cst_mac_a2.product
    WHERE
        cst_mac_a2.protype = 'HW' AND

        cst_mac_a2.datecreated in (SELECT MAX( sub3.datecreated ) from cst_mac as sub3 WHERE 
                                    cst_mac_a2.product = sub3.product AND sub3.datecreated <= @shortDate) AND

        cst_mac_a2.timecreated in (SELECT MAX( sub3.timecreated ) from cst_mac as sub3 WHERE
                                    cst_mac_a2.product = sub3.product AND sub3.datecreated in 
                                                (SELECT MAX( sub4.datecreated ) from cst_mac as sub4 WHERE 
                                                            sub4.datecreated <= @shortDate and sub4.product = sub3.product)) AND

        cst_mac_a2.PROGRESS_RECID in (SELECT MAX( sub3.PROGRESS_RECID ) from cst_mac as sub3 WHERE 
                                    cst_mac_a2.product = sub3.product AND sub3.datecreated in 
                                                (SELECT MAX( sub4.datecreated ) from cst_mac as sub4 WHERE
                                                            sub4.datecreated <= @shortDate AND sub4.product = sub3.product)) 
    GROUP BY
        cst_mac_a2.loc,
        cst_mac_a2.product,
        pro_duct.desc4)
    as quere2

    ON quere1.Product = quere2.Product AND quere1.Location = quere2.Location
GROUP BY
    quere1.Location,
    quere1.Product,
    quere1.Short
Order BY
    quere1.Location,
    quere1.Product,
    quere1.Short

这就是LEFT JOIN的工作方式。它从第一个查询中获取所有行,但从第二个查询中仅获取匹配行(根据ON子句中的连接条件)


如果您希望始终从两个查询中获取所有行,即使在相反的查询中没有匹配的行,也需要使用完整的外部联接。

如果我在第一个查询的where中添加行:cst_mac_a.product='a4group',它将返回一行(因此我们不必担心LEFT/JOIN)。如果我在0周前进行第一次查询,在2周前进行第二次查询,则第二次查询不返回任何内容(空白)。当第一次查询为-1周前,第二次查询为2周前时,第二次查询返回正确的结果,但第一次查询提前了1周。如果不知道您的数据是什么,我无法知道您为什么会看到所看到的结果。如果我的答案不能解决您的问题,您需要编辑您的问题并添加以下详细信息:示例数据、当前查询的结果、您尝试获取的结果。我添加了一些输出。这是一个奇怪的问题,第二个查询的输出在第一个查询的基础上发生了变化,但我知道数据在那里。您希望看到但没有看到的表中某些数据的示例是什么?在我的示例输出中,它显示了DataAgo、VolumeAgo和CostAgo的信息,这正是我想要看到的。但我只在curDate为1周前(从2016年2月1日起)时看到此数据,我想将当前数据与2周前的数据进行比较。如您所见,数据存在于此处(日期为2016年1月18日),但第一次查询(日期为2016年2月1日)将第二次查询(日期为2周前)弄乱(显示的是第一个示例,未显示任何数据)。基本上,它没有找到本例中显示的数据。
curDate = Today
shortDate = 2 weeks ago:
Location | Product | Short | Date | Volume | Cost | DateAgo | VolumeAgo | CostAgo
Mill     | A4ROUP  | BN.   | 2/1/2016|40   | 36   |         |           |

curDate = 1 week ago
shortDate = 2 weeks ago
Location | Product | Short | Date | Volume | Cost | DateAgo | VolumeAgo | CostAgo
Mill     | A4ROUP  | BN.   |1/25/2016|27   | 25   |1/18/2016|   29      | 26