我有两张桌子..一张是主表,另一张是每日报告表。
machine_id Machinename
1 abc
2 def
3 ghi
4 jkl
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
答案 0 :(得分:2)
尝试使用左连接而不是内部连接,即使第二个表中没有条目,也应该出现#3机器。
答案 1 :(得分:2)
您正在搜索具有特定日期的记录,但报告表中没有20110614
条目。
一种解决方案是使用UNION
初始SUM of'0'
为您的选择添加记录。
SUM
。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