【问题标题】:Multiple SELECT command in sql querysql查询中的多个SELECT命令
【发布时间】:2013-01-17 10:09:38
【问题描述】:

我想在我的sql中检索这种表:

    Type     Qad (type count)     Correct(No. of item without error)     Accuracy(%)
   type 1        3                                 3                            100
   type2         6                                 3                             50

我目前正在尝试使用此查询,但它有一个错误:

SELECT `type` AS 'ReturnType', COUNT(*) AS 'QAd',
(SELECT COUNT(*) FROM bartran WHERE QASample='2' AND QAErrorID='1' AND `type`=ReturnType AND TimefileDate BETWEEN '2012-01-01' AND '2012-12-31' AS 'Correct', 
(SELECT COUNT(*) FROM bartran WHERE QASample='2' AND QAErrorID='1' AND `type`=ReturnType AND TimefileDate BETWEEN '2012-01-01' AND '2012-12-31') / COUNT(*) * 100) AS 'Accuracy' 
FROM bartran WHERE QASample='2'
AND TimefileDate BETWEEN '2012-01-01' AND '2012-12-31'
GROUP BY TYPE;

我目前是这个新手,希望有人能帮助我。谢谢!!

【问题讨论】:

  • 说明返回的错误。
  • 从 bartran 中选择类型、Qad、正确、准确性,其中 QASample = '2' 以及您希望数据类似于 GROUP BY 类型的其他内容;

标签: c# .net mysql sql


【解决方案1】:

您在查询中缺少括号 ),正确的是:

SELECT `type`  AS 'ReturnType', 
       Count(*)   AS 'QAd', 
       (SELECT Count(*) 
        FROM   bartran 
        WHERE  qasample = '2' 
               AND qaerrorid = '1' 
               AND `type` = returntype 
               AND timefiledate BETWEEN '2012-01-01' AND '2012-12-31') AS 
       'Correct', 
       (SELECT Count(*) 
        FROM   bartran 
        WHERE  qasample = '2' 
               AND qaerrorid = '1' 
               AND `type` = returntype 
               AND timefiledate BETWEEN '2012-01-01' AND '2012-12-31') / Count(* 
       ) * 100 AS 'Accuracy' 
FROM   bartran 
WHERE  qasample = '2' 
       AND timefiledate BETWEEN '2012-01-01' AND '2012-12-31' 
GROUP  BY type; 

更好的查询是:

SELECT `type` AS 'ReturnType', 
       Count(*)  AS 'QAd', 
       Count(CASE 
               WHEN qaerrorid = '1' THEN 1 
               ELSE NULL 
             end)  AS 'Correct', 
       Count(CASE 
               WHEN qaerrorid = '1' THEN 1 
               ELSE NULL 
             end) / Count(*) * 100 AS 'Accuracy' 
FROM   bartran 
WHERE  qasample = '2' 
       AND timefiledate BETWEEN '2012-01-01' AND '2012-12-31' 
GROUP  BY type;

【讨论】:

  • 我认为这现在解决了我的问题,但为什么执行需要很多时间? 1分钟加。 :(
  • @JRC 试试我添加的新查询
  • @Ankur 最好使用 SUM 代替 Count SUM(CASE WHEN qaerrorid = '1' THEN 1 ELSE 0 end)。也使用COUNT(1),而不是COUNT(*)。会快一点
  • @AndreyVoloshin count(1) 和 count(*) 相同,请参阅this,如果 sum 比 count 好,我也找不到任何地方,所以我更喜欢 count 代码清晰度点查看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2017-01-10
相关资源
最近更新 更多