问题描述
|
我有两个表..一个是主表,另一个是每日报告表。
主表:
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