【问题标题】:Count table value by hour using sproc使用 sproc 按小时计算表值
【发布时间】:2015-02-18 17:15:42
【问题描述】:

在我的表中,我有日期列,上面有默认值 TIMESTAMP。我想按小时计算我的记录。我像这样使用sproc

    SELECT username, 


    COUNT(IF(HOUR(date)=8,1,NULL)  and (IF(docs != null))) AS '8:30  - 9:00', 
    COUNT(IF(HOUR(date)=9,1,NULL)  and (IF(docs != null))) AS '9:00 - 10:00',
    COUNT(IF(HOUR(date)=10,1,NULL) and (IF(docs != null))) AS '10:00 - 11:00',
    COUNT(IF(HOUR(date)=11,1,NULL) and (IF(docs != null))) AS '11:00 - 12:00',
    COUNT(IF(HOUR(date)=12,1,NULL) and (IF(docs != null))) AS '12:00 - 1:00',
    COUNT(IF(HOUR(date)=13,1,NULL) and (IF(docs != null))) AS '1:00 - 2:00',
    COUNT(IF(HOUR(date)=14,1,NULL) and (IF(docs != null))) AS '2:00 - 3:00',
    COUNT(IF(HOUR(date)=15,1,NULL) and (IF(docs != null))) AS '3:00 - 4:00',
    COUNT(IF(HOUR(date)=16,1,NULL) and (IF(docs != null))) AS '4:00 - 5:00',
    COUNT(disblid) 'Total'


FROM claimloans 
group by username;

没有

and (IF(docs != null))

我的 sproc 工作完美。如果行文档值为空,我不想计算行。我怎样才能做到这一点?

这是我的工作存储过程

SELECT username, 

    COUNT(IF(HOUR(date)=8,1,NULL))  AS '8:30  - 9:00', 
    COUNT(IF(HOUR(date)=9,1,NULL))  AS '9:00 - 10:00',
    COUNT(IF(HOUR(date)=10,1,NULL)) AS '10:00 - 11:00',
    COUNT(IF(HOUR(date)=11,1,NULL)) AS '11:00 - 12:00',
    COUNT(IF(HOUR(date)=12,1,NULL)) AS '12:00 - 1:00',
    COUNT(IF(HOUR(date)=13,1,NULL)) AS '1:00 - 2:00',
    COUNT(IF(HOUR(date)=14,1,NULL)) AS '2:00 - 3:00',
    COUNT(IF(HOUR(date)=15,1,NULL)) AS '3:00 - 4:00',
    COUNT(IF(HOUR(date)=16,1,NULL)) AS '4:00 - 5:00',
    COUNT(disblid) 'Total'


FROM claimloans 
group by username;

【问题讨论】:

    标签: mysql stored-procedures count


    【解决方案1】:

    Nothing is ever equal to nullx = nullx != null 始终为 false),因此您需要将 docs != NULL 更改为 docs IS NOT NULL

    【讨论】:

    • 我把它改成了“and docs IS NOT NULL”,但它仍然计算空值:(
    【解决方案2】:

    所以,这个表达式:

    COUNT(IF(HOUR(date)=8,1,NULL))
    

    date 的小时数为8 时,计数1,一个硬编码的非空表达式。如果将1 替换为doc

    COUNT(IF(HOUR(date)=8,doc,NULL))
    

    该函数将根据doc 的内容额外计算。也就是说,它不仅会在小时为 8 时计数行,而且会在 doc 同时不为空时计数。

    【讨论】:

      【解决方案3】:

      感谢所有帮助过我的人。在您的帮助下,我制作了以下 sproc,它完全符合我的要求。

          DELIMITER $$
      
      CREATE DEFINER=`root`@`localhost` PROCEDURE `hourcounter`(IN datestamp DATE)
      BEGIN
      SELECT username, 
      
          COUNT(IF(HOUR(modifytime)=8,1,NULL))  AS '8:30  - 9:00', 
          COUNT(IF(HOUR(modifytime)=9,1,NULL))  AS '9:00 - 10:00',
          COUNT(IF(HOUR(modifytime)=10,1,NULL)) AS '10:00 - 11:00',
          COUNT(IF(HOUR(modifytime)=11,1,NULL)) AS '11:00 - 12:00',
          COUNT(IF(HOUR(modifytime)=12,1,NULL)) AS '12:00 - 1:00',
          COUNT(IF(HOUR(modifytime)=13,1,NULL)) AS '1:00 - 2:00',
          COUNT(IF(HOUR(modifytime)=14,1,NULL)) AS '2:00 - 3:00',
          COUNT(IF(HOUR(modifytime)=15,1,NULL)) AS '3:00 - 4:00',
          COUNT(IF(HOUR(modifytime)=16,1,NULL)) AS '4:00 - 5:00',
          COUNT(docs) 'Total'
      
      
      FROM claimloans 
      WHERE docs != '' and DATE(date) = datestamp 
      group by username;
      
         END
      

      感谢所有帮助过我的人。我从你的回答中学到了很多!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-14
        • 1970-01-01
        • 2020-04-15
        • 1970-01-01
        • 1970-01-01
        • 2018-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多