帮我形成一个SQL查询

时间:2011-06-15 08:48:03

标签: sql-server sql-server-2008

我有两张桌子..一张是主表,另一张是每日报告表。

主表:

 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, 0, 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, machinename,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**

感谢和问候

T.Navin

enter image description here

输出:

enter image description here

3 个答案:

答案 0 :(得分:2)

尝试使用左连接而不是内部连接,即使第二个表中没有条目,也应该出现#3机器。

答案 1 :(得分:2)

您正在搜索具有特定日期的记录,但报告表中没有20110614条目。

一种解决方案是使用UNION初始SUM of'0'为您的选择添加记录。

  • 这些虚假记录不会摒弃您现有的SUM
  • 他们将显示“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, 0, 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
                    , vfrm.entry_date
                    , '0'
            FROM    ven_machinemaster vm
                    CROSS APPLY ven_fullreportmaster vfrm
            WHERE   vfrm.entry_date BETWEEN '20110614' AND  '20110615' 
         ) AS SubQueryALias  
GROUP BY
        entry_date
        , machinename
        , TotalMins --,shift_type    

答案 2 :(得分:1)

而不是:

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