2012-08-10 71 views
0

我希望有人可以在这里提供帮助和一些建议。我试图得到一个相当复杂的结果,并不确定我是否可以将它作为一个带有子查询,联合的查询来完成,或者只是将单独的查询合并到事后的Excel中。计算部分值或条件值

我从我的前任与下表中的遗留数据库工作: 业务(列有工作:ID,部门,国家) 形式(与工作列:提交(Y/N),身份证,business_id ) 库存(柱的工作:IN_STOCK(Y/N),身份证,form_id)

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

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

主要的问题我得到的是虽然提交表单不需要任何进一步的参数,并且是一个简单的计数,但未提交ms依赖于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的行的总数。

如果为提交和取消提交运行单独的查询对于最终结果是很好的,但是我需要一些帮助来获取正确数量的未提交表单,并将in_stock标记为Y.此外,我试图使用COUNT DISTINCT但时间过长,10分钟后还在跑步。我可以在单个查询选项中设想的另一个复杂因素是提交或未提交表单中0/null值的可能性

任何帮助都非常感谢!

回答

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 
; 
+0

谢谢,这说明我怎么得到一个结果提交/未提交列,但不会纳入在未提交文档的In_stock变量中。 – 2012-08-10 14:50:40

+0

@凯维诺:啊,对不起。所以,我很困惑。你写到“未提交的表单依赖于Inventory.in_stock ='Y'”,但是你没有解释依赖关系*的含义。它看起来像'Inventory'是'Forms'的孩子,而不是其他方式;那么你是否正在寻找一些未提交的表单,其中有* in_stock ='Y''的至少一个库存记录?或者你是否在寻找有'in_stock ='Y''属于未提交表单的'库存'记录?要么 。 。 。 ? – ruakh 2012-08-10 14:54:23

+0

我的歉意,回想起来你是对的,不清楚。是的,我的前任基本上处于层次结构:业务,表单,库存,所以库存是表单的一个孩子。我正在寻找一个未提交的表单,其中至少有一个具有'in_stock ='Y''的库存记录 – 2012-08-10 14:58:47