适用于同一字段的多个过滤器的子句加上“全选”选项

时间:2015-08-03 20:24:03

标签: sql sql-server

我已经广泛搜索了Stack Overflow和其他网站,我无法找到问题的答案。这是一个复杂的问题,我发现的大多数解决方案都不尽如人意。

我正在使用Logi Info Studio为客户端显示自定义数据表。所有真正重要的是我正在处理3个下拉菜单,每个下拉菜单都有一个“全部x”选项。单击其中一个时,应执行SQL语句以过滤数据表。

我在数据库中有一个表。它具有业务类型和数据类型的列。例如:

BUSINESS_TYPE        DATA_TYPE
Bob's Store          direct
Thrifty Mart         direct
Mike's Car Repair    indirect
Quick Lube           indirect
Physician's Assoc    other
Jewelry Wholesalers  other

我将下拉菜单设置为显示每种数据类型的所有唯一BUSINESS_TYPE值,每个下拉列表都有“All”选项,如“All Direct”。 Logi会将用户在下拉列表中选择的选项作为标记传递,例如@ Request.Direct,@ Request.Indirect和@Request.Other。从这里开始,我需要获取令牌值并相应地过滤数据(Logi处理令牌很好。)

我遇到问题的地方是我在WHERE子句中使用3个不同的参数进行过滤,并且每个参数都可以是“All”选项,例如,它将在字面上传递为“All Direct”。

这是我的查询。它旨在制作一种交叉表,累计按时付款的交易和每个国家的总交易。

Select COUNTRY,  
  SUM(CASE WHEN DATA_TYPE = 'Indirect' AND ON_TIME_INDICATOR = 'Yes' THEN 1 ELSE 0 END) AS 'IndirectOnTime',
  SUM(CASE WHEN DATA_TYPE = 'Direct' AND ON_TIME_INDICATOR = 'Yes' THEN 1 ELSE 0 END) AS 'DirectOnTime',
  SUM(CASE WHEN DATA_TYPE = 'Other' AND ON_TIME_INDICATOR = 'Yes' THEN 1 ELSE 0 END) AS 'OtherOnTime',
  SUM(CASE WHEN DATA_TYPE = 'Indirect' THEN 1 ELSE 0 END) AS 'IndirectTotal',
  SUM(CASE WHEN DATA_TYPE = 'Direct' THEN 1 ELSE 0 END) AS 'DirectTotal',
  SUM(CASE WHEN DATA_TYPE = 'Other' THEN 1 ELSE 0 END) AS 'OtherTotal',
  COUNT(*) AS 'Country_Total'
From TRANSACTIONS
WHERE

GROUP BY COUNTRY

我需要用户能够从几个下拉列表中选择一个值,或者在几乎任何组合中选择“全部”选项。选择后,例如,间接下拉列表的间接BUSINESS_TYPE和其他2的“全部”,我需要它仅过滤所选值间接的BUSINESS_TYPE记录,但不过滤直接或其他记录。如果用户为所有3个下拉列表选择“全部”选项,我需要显示BUSINESS_TYPE字段的所有记录,这些记录由Logi将通过的“All Direct”,“All Indirect”和“All Other”值复杂化到查询。

是的,我的WHERE子句是空的,因为我不知道该怎么做才能完成这个。我尝试了AND和OR语句的各种组合。我尝试在BUSINESS_TYPE字段上使用带有HAVING语句的COUNT。我已经修改了子查询,但老实说我不知道​​这会如何改进。我尝试使用NULLIF()以某种方式停用参数,如果它是“全部”。

据我所知,存储过程在这里可以正常工作,所以我当然可以这样做。我并没有承诺只使用像这样的常规SQL语句。

我希望我已经很好地解释了这一点。这很复杂,而且我担心我会陷入其中并且无法看到森林中的树木。 对不起我遗漏的任何事情等等。我很乐意提供可能需要的任何其他信息。我可以深入细节。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这样的事情应该有效:

where
    (DATA_TYPE='Direct' and (@Request.Direct in ('All Direct', BUSINESS_TYPE)) or
    (DATA_TYPE='Indirect' and (@Request.Indirect in ('All Indirect', BUSINESS_TYPE)) or
    (DATA_TYPE='Other' and (@Request.Other in ('All Other', BUSINESS_TYPE))