具有两个AND且包含多个OR的SQL select语句

时间:2019-09-04 20:37:34

标签: sql sql-server

难以理解以下代码为何不起作用。

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

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

1 个答案:

答案 0 :(得分:0)

您可能想将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