帮助我形成sql查询

问题描述

| 我有两个表..一个是主表,另一个是每日报告表。 主表:
 machine_id  Machinename 
    1           abc
    2           def
    3           ghi
    4           jkl
ven_fullreportmaster:
entry_date   machine_id  description_id  tot_time   shift_id  
 20110613      1             1             10         1
 20110613      2             2              9         2
 20110614      1             1             10         1
 20110614      1             2              9         2
 20110614      3             3              5         3
 20110614      2             4             10         1
 20110614      2             1              9         2
 20110614      2             5              5         3
现在,我想从每日报告表中检索数据,该数据应包含所有机器名称以及tot_time和entry_date。 我已经使用此查询来检索数据,
 select  entry_date,machinename,(IsNull(cast(TotalMins / 60 as varchar(24)),\'0\') + \':\' +  IsNull(cast(TotalMins % 60 as varchar(24)),\'0\'))   as TotalHrs--,shift_type                
    from    (           
    select  vm.machinename,vfrm.entry_date,sum(case when vfrm.description_id in (\'1\',\'2\',\'3\',\'4\',\'5\') then DateDiff(mi,total_time) else \'0\'  end) as TotalMins
   --vsm.shift_type            
    from    ven_fullreportmaster vfrm      
                    inner join  ven_machinemaster vm   on  vm.machine_id = vfrm.machine_id
                    inner join ven_shifttypemaster vsm on vsm.shift_id = vfrm.shift_id          
                      where  vfrm.entry_date = \'20110614\' 
                        -- and  vfrm.shift_id in (1,2,3)                                
    group by   machinename,vfrm.entry_date --,vsm.shift_type         
         ) as SubQueryALias  group by  entry_date,TotalMins --,shift_type    
当我运行上面的查询时,我仅获得机器ID 1、2,3的详细信息。 输出
   entry_date            machineid  TotalHrs
2011-06-14 00:00:00.000     1              19:0
2011-06-14 00:00:00.000     2              24:0
2011-06-14 00:00:00.000     3              5:0
我需要为每个班次在TotalMins中获得machine_id = 4值作为0 ..如何解决它..plz帮助我.. 预期输出
 entry_date          machineid  TotalHrs
2011-06-14 00:00:00.000     1              19:0
2011-06-14 00:00:00.000     2              24:0
2011-06-14 00:00:00.000     3              5:0
**2011-06-14 00:00:00.000       4              0:0**
谢谢并恭祝安康 纳文 输出:     

解决方法

        代替:
from  ven_fullreportmaster vfrm      
        inner join  ven_machinemaster vm   on  vm.machine_id = vfrm.machine_id
        inner join ven_shifttypemaster vsm on vsm.shift_id = vfrm.shift_id  
            where  vfrm.entry_date = \'20110614\'    
你可以试试这个
LEFT JOIN
吗?注意条件从
WHERE
移到
ON
子句:
FROM  ven_machinemaster vm    
    LEFT JOIN  ven_fullreportmaster vfrm    
        ON   vm.machine_id = vfrm.machine_id
        AND  vfrm.entry_date = \'20110614\' 
    INNER JOIN ven_shifttypemaster vsm
        ON   vsm.shift_id = vfrm.shift_id       
要么:
FROM  ven_machinemaster vm    
    LEFT JOIN  ven_fullreportmaster vfrm    
        ON   vm.machine_id = vfrm.machine_id
        AND  vfrm.entry_date = \'20110614\' 
    LEFT JOIN ven_shifttypemaster vsm
        ON   vsm.shift_id = vfrm.shift_id   
    ,        尝试使用左联接而不是内部联接,即使第二张表中没有条目,这也应该使3号计算机出现。     ,        您正在搜索具有特定日期的记录,但报表表中没有for11的条目。 一种解决方案是使用带有首字母ѭ13的
UNION
将记录添加到您的选择中。 这些伪造的记录不会影响您现有的ѭ14throw。 它们将显示带有“ 0”的缺少数据的位置。 SQL语句
SELECT  entry_date,machinename,(ISNULL(CAST(TotalMins / 60 AS VARCHAR(24)),\'0\') + \':\' +  ISNULL(CAST(TotalMins % 60 AS VARCHAR(24)),\'0\')) AS TotalHrs--,shift_type                
 FROM   (           
            SELECT  vm.machinename,vfrm.entry_date,SUM(case when vfrm.description_id in (\'1\',\'2\',\'3\',\'4\',\'5\') THEN DATEDIFF(mi,total_time) else \'0\' END) AS TotalMins --vsm.shift_type            
            FROM    ven_fullreportmaster vfrm      
                    INNER JOIN ven_machinemaster vm on  vm.machine_id = vfrm.machine_id
                    INNER JOIN ven_shifttypemaster vsm on vsm.shift_id = vfrm.shift_id          
                    WHERE   vfrm.entry_date BETWEEN \'20110614\' AND  \'20110615\' 
            GROUP BY
                    machinename,vfrm.entry_date --,vsm.shift_type
            UNION ALL
            SELECT  DISTINCT vm.machinename,\'0\'
            FROM    ven_machinemaster vm
                    CROSS APPLY ven_fullreportmaster vfrm
            WHERE   vfrm.entry_date BETWEEN \'20110614\' AND  \'20110615\' 
         ) AS SubQueryALias  
GROUP BY
        entry_date,TotalMins --,shift_type