首页 > 解决方案 > 带有两个 AND 且包含多个 OR 的 SQL 选择语句

问题描述

无法理解为什么下面的代码不起作用。

WHERE 子句中的第二行和第三行不能一起使用。如果我拿出一个(或者)他们工作。我确信我正在做的事情有一个术语,但我找不到它。

SELECT oh.location,SUM(od.net_ext) as retail_sales
FROM comm.dbo.ordhrd as oh
JOIN comm.dbo.ordetail as od
    ON od.location = oh.location
    AND od.invoice# = oh.invoice#
    AND od.inv_date = oh.inv_date
JOIN comm.dbo.invmas as inv
    ON inv.item_num = od.item#
WHERE type_of_rec = '01'
    AND ( inv.in_group = 'LABM' OR inv.in_group = 'LABQ' OR inv.in_group = 'LABP' )
    AND ( inv.category = 'LTAT' OR inv.category = 'LTMT' OR inv.category = 'LTHWY' OR inv.category = 'TOUR' OR inv.category = 'UHP' OR inv.category = 'SNOW' OR inv.category = 'STDLS' )
    AND od.inv_date BETWEEN '" . $current_start_date . "' AND '" . $current_end_date . "'
GROUP BY oh.location

预期结果将是过滤查询的结果

标签: sqlsql-server

解决方案


您可能希望将 in_group、category 和 type_of_rec 添加到 GROUP BY 子句中。如果您仍然没有收到结果,那么您的查询错误可能有多种原因。连接可能没有限制,inv.category 字符串需要'% %'通配符,BETWEEN 子句的格式可能没有正确映射(即:错误的日期格式会抛出结果)等。

或者,坦率地说,可能没有任何记录符合您的 WHERE 子句标准。在评论中,您声明从查询的 WHERE 部分中删除行使其返回行。这告诉你什么?重新添加它可能会限制过滤器返回任何行。

如果不发布示例数据,此站点上的用户几乎不可能判断有效查询的外观。

我在下面写了一些可能更灵活的东西。它将 WHERE 子句中引用的列添加到 GROUP BY 子句,使用 IN 子句格式化 AND/OR 子句(提高可读性/限制潜在错误)并用 LEFT JOIN 替换 JOIN 语句

SELECT oh.location,
    SUM(od.net_ext) as retail_sales
    FROM comm.dbo.ordhrd as oh
    LEFT JOIN comm.dbo.ordetail as od
        ON od.location = oh.location
        AND od.invoice# = oh.invoice#
        AND od.inv_date = oh.inv_date
    LEFT JOIN comm.dbo.invmas as inv
        ON inv.item_num = od.item#
    WHERE type_of_rec = '01'
        AND inv.in_group IN ('LABM','LABQ','LABP' )
        AND inv.category IN ('LTAT', 'LTMT', 'LTHWY', 'TOUR','UHP', 'SNOW', 'STDLS')
        AND od.inv_date BETWEEN '" . $current_start_date . "' AND '" . $current_end_date . "'
GROUP BY oh.location, inv.in_group, inv.category

推荐阅读