2011-10-03 79 views
3

(也贴here多个查询

所以我有两个表,一个是invalid表,另一个是valid表。

valid表:

id 
status 
date 

invalid表:

id 
status 
date 

我不得不产生这种输出报告:在2公共字段:

date  on-time late total valid invalid1 invalid2 total rate 
--------- ------- ---- ----- ----- -------- -------- ----- ---- 
9/10/2011 4  10 14  3  3   3   6 
  • date Ť ABLES,场小组通过,有多少条记录在那一天有
  • on-time:在有效的表中的所有ID的数量
  • late:对无效的表
  • total所有记录(ID)数:对时间总计和
  • valid:与“有效”状态的有效表ID的数量
  • invalid1:与“invalid1”状态
  • invalid2无效的表ID的计数:计数ID与 “invalid2” 状态
  • total无效表:总有效invalid1的,invalid2
  • rate:平均总量

这是一个与不同的表基本上多个查询。我怎样才能实现它?

+0

尽量正确地格式化您的文章,请。我试过了,但我不知道“total”和“total rate”是不是2列。 – Icarus

+0

他们是两个不同的列 –

+0

我重新格式化了你的文章,特别是输出表,因为它看起来有点混乱。它中的某些部分似乎仍然缺失或不清楚。请检查它并根据情况进行修改。 (未来,请不要*在这里使用制表符,它们通常会导致混乱的外观。) –

回答

2

成才这样吗?

SELECT 
    *, 
    (result.total + result._total)/2 AS rate 
FROM (
    SELECT 
     date, 
     SUM(CASE WHEN data.valid = 1 THEN 1 ELSE 0 END) AS ontime, 
     SUM(CASE WHEN data.valid = 0 THEN 1 ELSE 0 END) AS late, 
     COUNT(*) AS total, 
     SUM(CASE WHEN data.valid = 1 AND data.status = 'valid' THEN 1 ELSE 0 END) AS valid, 
     SUM(CASE WHEN data.valid = 0 AND data.status = 'invalid1' THEN 1 ELSE 0 END) AS invalid1, 
     SUM(CASE WHEN data.valid = 0 AND data.status = 'invalid2' THEN 1 ELSE 0 END) AS invalid2, 
     SUM(CASE WHEN data.status IN ('valid', 'invalid', 'invalid2') THEN 1 ELSE 0 END) AS _total 

    FROM (
     SELECT 
      date, 
      status, 
      valid = 1 
     FROM 
      Valid 
     UNION ALL 
     SELECT 
      date, 
      status, 
      valid = 0 
     FROM 
      InValid) AS data 
    GROUP BY 
     date) AS result 
+0

谢谢ou!这正是我需要的! –

1
SELECT date, ontime, late, ontime+late total, valid, invalid1, invalid2, valid+invalid1+invalid2 total 
FROM 
(SELECT date, 
     COUNT(*) late, 
     COUNT(IIF(status = 'invalid1', 1, NULL)) invalid1, 
     COUNT(IIF(status = 'invalid2', 1, NULL)) invalid2, 
FROM invalid 
GROUP BY date 
) JOIN (
SELECT date, 
     COUNT(*) ontime, 
     COUNT(IIF(status = 'valud', 1, NULL)) valid, 
FROM valid 
GROUP BY date 
) USING (date) 
0

首先,似乎你持有恰好在2台相同的信息 - 我建议合并这些表一起,并添加一个名为valid一个额外的布尔列,以保存有关记录的有效性信息。

你的存在的数据库结构的查询可能是这个样子:

SELECT unioned.* FROM (
    (SELECT v.date AS date, v.status AS status, v.id AS id, COUNT(id) AS valid, 0 AS invalid1, 0 AS invalid2 FROM valid v GROUP BY v.date) 
    UNION 
    (SELECT i1.date AS date, i1.status AS status, i1.id AS id, 0 AS valid, COUNT(i1.id) AS invalid1, 0 AS invalid2 FROM invalid1 i1 GROUP BY i1.date) 
    UNION 
    (SELECT i2.date AS date, i2.status AS status, i2.id AS id, 0 AS valid, 0 AS invalid1, COUNT(i.id) AS invalid2 FROM invalid1 i1 GROUP BY i1.date) 

) AS unioned GROUP BY unioned.date 
+0

它给了我ff错误:列'unioned.valid'在选择列表中无效,因为它不是包含在聚合函数或GROUP BY子句中。列'unioned.invalid1'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。列'联合。invalid2'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 –