0

我希望有人可以在这里提供帮助和一些建议。我试图获得一个相当复杂的结果,但不确定我是否可以将其作为一个带有子查询、联合的查询,或者只是将单独的查询在事后合并到 excel 中。

我正在使用来自我的前任的遗留数据库,其中包含下表: 业务(使用的列:id、sector、state) 表单(使用的列:提交(Y/N)、id、business_id) 库存(使用的列: In_stock (Y/N), id, form_id)

我试图得到一个看起来像这样的最终结果:

| SubmittedForms | Unsubmitted Forms | Sector | State |
|-----------------------------------------------------|
|       10       |         5         |  Agr   |  UT   |
|       0        |         7         |  Chem  |  MT   |
|       2        |         1         |  Bio   |  OK   |
|       13       |         0         |  Chem  |  NM   |

我遇到的主要问题是,虽然提交的表单不需要任何进一步的参数并且是一个简单的计数,但未提交的表单取决于 Inventory.in_stock='Y'。这是我对提交表单的查询:

SELECT COUNT(Forms.id) AS Submitted, Business.sector, Business.state
FROM Forms
JOIN Business ON Forms.business_id=Business.id
WHERE Forms.submitted='Y'
GROUP BY Business.state, Business.sector

不幸的是,我似乎无法正确计算未提交的表格编号。它只返回该扇区的 in_stock 为 Y 的总行数。

如果对 Submitted 和 Unsubmitted 运行单独的查询更容易,这对最终结果来说很好,但我需要一些帮助来获得正确计数的未提交表单,其中 in_stock 标记为 Y。此外,我尝试使用 COUNT DISTINCT 但也采取了方式长,10分钟后还在运行。我可以在单个查询选项中设想的另一个复杂情况是提交或未提交形式中的 0/null 值的可能性

任何帮助是极大的赞赏!

4

1 回答 1

0

一种选择:

SELECT COUNT(CASE WHEN Forms.submitted = 'Y' THEN 1 END) SubmittedForms,
       COUNT
        ( CASE WHEN Forms.submitted = 'N'
                AND EXISTS ( SELECT 1
                               FROM Inventory
                              WHERE form_id = Forms.id
                                AND in_stock = 'Y'
                           )
               THEN 1
           END
        ) UnsubmittedForms,
       Business.sector Sector,
       Business.state State
  FROM Forms
 RIGHT
 OUTER
  JOIN Business 
    ON Forms.business_id = Business.id
 GROUP
    BY Business.sector,
       Business.state
;

另一种可能表现更好的选择:

SELECT COUNT(CASE WHEN Forms.submitted = 'Y' THEN 1 END) SubmittedForms,
       COUNT(CASE WHEN Forms.submitted = 'N' THEN 1 END) UnsubmittedForms,
       Business.sector Sector,
       Business.state State
  FROM ( SELECT *
           FROM Forms
          WHERE submitted = 'Y'
             OR id IN ( SELECT DISTINCT form_id
                          FROM Inventory
                           AND in_stock = 'Y'
                      )
       ) Forms
 RIGHT
 OUTER
  JOIN Business 
    ON Forms.business_id = Business.id
 GROUP
    BY Business.sector,
       Business.state
;
于 2012-08-10T14:43:45.493 回答