【问题标题】:multiple query same table but in different columns mysql多个查询同一个表但在不同的列mysql
【发布时间】:2016-01-13 08:21:48
【问题描述】:

我正在尝试获取更多列来汇总 2 个不同表的结果

SET @start_res = 20150301;
SET @finish_res= 20150501;
SET @finish_check= 20150801;
SET @start_check= 20150301;
SET @daily_hos= 3;

SELECT* from
   ( SELECT COUNT(DAY_IN) AS arr FROM t_hospital WHERE DAY_IN between  @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN  )e,
     (SELECT COUNT(PAT_STATUS) AS ONG1 FROM t_hospital WHERE PAT_STATUS  like '%ong%' and  DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN ) a,
        (SELECT COUNT(PAT_STATUS) AS RTED FROM t_hospital WHERE PAT_STATUS  like '%rtde%'and  DAY_IN between  @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN  )b,
           (SELECT COUNT(PAT_STATUS) AS POLI FROM t_hospital WHERE PAT_STATUS  like '%pol%'and DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN   )c,
              (SELECT COUNT(PAT_STATUS) AS para FROM t_hospital WHERE PAT_STATUS  like '%para%' and  DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res  and ID_daily_hos =@daily_hos group by DAY_IN  )d

当然它不起作用,只有第一个显示的列 (arr) 有效,而其他列显示错误的输出。

我哪里错了?

【问题讨论】:

标签: mysql sql


【解决方案1】:

如果我理解正确,这就是你想要的。

SET @start_res = 20150301;
SET @finish_res= 20150501;
SET @finish_check= 20150801;
SET @start_check= 20150301;
SET @daily_hos= 3;

SELECT 

(SELECT COUNT(DAY_IN) FROM t_hospital WHERE 
DAY_IN between  @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res and 
ID_daily_hos =@daily_hos) AS 'arr' ,

(SELECT COUNT(PAT_STATUS) FROM t_hospital WHERE 
PAT_STATUS  like '%ong%' and  
DAY_IN between @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res  and 
ID_daily_hos =@daily_hos) AS 'ONG1' ,

(SELECT COUNT(PAT_STATUS) FROM t_hospital WHERE 
PAT_STATUS  like '%rtde%' and  
DAY_IN between  @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res  and 
ID_daily_hos =@daily_hos) AS 'RTED' ,

(SELECT COUNT(PAT_STATUS) FROM t_hospital WHERE 
PAT_STATUS  like '%pol%' and 
DAY_IN between @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res  and 
ID_daily_hos =@daily_hos) AS 'POLI' ,

(SELECT COUNT(PAT_STATUS) FROM t_hospital WHERE 
PAT_STATUS  like '%para%' and  
DAY_IN between @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res  and 
ID_daily_hos =@daily_hos) AS 'para'

【讨论】:

    【解决方案2】:

    试试这个:-

    SET @start_res = 20150301;
    SET @finish_res= 20150501;
    SET @finish_check= 20150801;
    SET @start_check= 20150301;
    SET @daily_hos= 3;
    
    SELECT 
    
    (SELECT COUNT(DAY_IN) AS arr FROM t_hospital WHERE 
    DAY_IN between  @start_check and @finish_check and 
    RES_DATE between @start_res and @finish_res and 
    ID_daily_hos =@daily_hos) e,
    
    (SELECT COUNT(PAT_STATUS) AS ONG1 FROM t_hospital WHERE 
    PAT_STATUS  like '%ong%' and  
    DAY_IN between @start_check and @finish_check and 
    RES_DATE between @start_res and @finish_res  and 
    ID_daily_hos =@daily_hos) a,
    
    (SELECT COUNT(PAT_STATUS) AS RTED FROM t_hospital WHERE 
    PAT_STATUS  like '%rtde%' and  
    DAY_IN between  @start_check and @finish_check and 
    RES_DATE between @start_res and @finish_res  and 
    ID_daily_hos =@daily_hos)b,
    
    (SELECT COUNT(PAT_STATUS) AS POLI FROM t_hospital WHERE 
    PAT_STATUS  like '%pol%' and 
    DAY_IN between @start_check and @finish_check and 
    RES_DATE between @start_res and @finish_res  and 
    ID_daily_hos =@daily_hos) c,
    
    (SELECT COUNT(PAT_STATUS) AS para FROM t_hospital WHERE 
    PAT_STATUS  like '%para%' and  
    DAY_IN between @start_check and @finish_check and 
    RES_DATE between @start_res and @finish_res  and 
    ID_daily_hos =@daily_hos) d
    

    您的问题提到了加入 2 个表,但似乎只有 t_hospital 有问题。您可能希望使用有关其他表的信息来更新您的问题。

    【讨论】:

      【解决方案3】:

      这是一个很常见的模式:

      SELECT DAY_IN, COUNT(*) AS arr,
              SUM(IF(PAT_STATUS  like '%ong%', 1, 0)) AS ONG1,
              SUM(IF(PAT_STATUS  like '%rtde%', 1, 0)) AS RTED,
              SUM(IF(PAT_STATUS  like '%pol%', 1, 0)) AS POL1,
              SUM(IF(PAT_STATUS  like '%para%', 1, 0)) AS para
      FROM t_hospital 
      WHERE DAY_IN between @start_check and @finish_check 
          and RES_DATE between @start_res and @finish_res  
          and ID_daily_hos =@daily_hos
      GROUP BY DAY_IN
      

      【讨论】:

      • 这让我很开心。一旦你知道它就很容易......谢谢伙计!
      【解决方案4】:

      在 SQL Server 2005+ 中,您可以使用窗口函数。 但 MySQL 不支持它。

      在子查询中,选择语句必须有连接运算符。像这样:

      SELECT * FROM (
          (SELECT COUNT(..) ...) AS C1
             INNER JOIN (SELECT COUNT(...) ...) AS C2
                  ON <condition>
             INNER JOIN ... )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-29
        • 1970-01-01
        相关资源
        最近更新 更多