2012-12-18 38 views
0

我有2个表(THour_IN和THour_OUT)具有相同的架构选择查询make query:与条件从第二表中的列

SELECT THour_IN.Name, THour_IN.date, THour_IN.HourIN, THour_OUT.HourOUT FROM THour_IN LEFT JOIN THour_OUT ON (Hour_IN.Name = THour_OUT.Name) AND (Hour_IN.date = THour_OUT.date); 

但是这在我的情况下是不正确的,因为我有多个表格中的同一日期的行。其结果是:

Name date  HourIN HourOUT 
AAA 24/11/2013 17:33:06 20:33:27 
AAA 24/11/2013 17:33:06 16:36:06 
AAA 24/11/2013 07:33:27 20:33:27 
AAA 24/11/2013 07:33:27 16:36:06 
BBB 18/11/2013    16:36:06 
BBB 19/11/2013 07:33:30  
BBB 21/11/2013 07:29:24 08:33:22 
BBB 22/11/2013 07:33:30 16:34:53 

它应该是日期24/11/2013首先HourIN(7时33分27秒)与最前一页HourOUT(16时36分06秒),第二HourIN(17时33分06秒) with Second HourOUT(20:33:06)有什么想法?

回答

0

您可以使用像这样:

SELECT 
    t.Name, 
    t.Date, 
    t.HourIN, (
    SELECT Top 1 HourOut 
    FROM THourOUT o 
    WHERE o.Name=t.Name AND o.Date=t.date And o.HourOUT>t.HourIN 
    ORDER BY o.HourOUT,o.ID) AS HrOut 
FROM THourIN AS t 
ORDER BY t.Date, t.HourIN; 

注意,我添加了一个ID为OUT表,以确保最高的1不返回重复。

下面是插入缺失值的示例。它依赖于Numbers表,其中包含从0或1到最大缺失值数的整数。数字表格在很多方面都很有用。

INSERT INTO thourin 
      (name, 
      [date]) 
SELECT q.name, 
     q.DATE 
FROM (SELECT Outs.name, 
       Outs.DATE, 
       Outs.countofout, 
       Ins.countofin 
     FROM (SELECT o.name, 
         o.DATE, 
         Count(o.name) AS CountOfOut 
       FROM thourout o 
       GROUP BY o.name, 
          o.DATE) AS Outs 
       LEFT JOIN (SELECT t.name, 
           t.DATE, 
           Count(t.name) AS CountOfIn 
          FROM thourin t 
          GROUP BY t.name, 
            t.DATE) AS Ins 
         ON (Outs.name = Ins.name) 
         AND (Outs.DATE = Ins.DATE) 
     WHERE (((Ins.countofin) <> [countofout] 
        OR (Ins.countofin) IS NULL))) AS q, 
     numbers AS n 
WHERE (((n.counter) > 0 
      AND (n.counter) <= [countofout] - [countofin])) 
+0

感谢您的回复。我使用这个查询。现在我有其他问题。当我有诸如 名称日期HourIN AAA 24/11/2012七时30分00秒 AAA 24/11/2012 15:30:00 AAA 25/11/2012七时33分27秒 名称数据日期HourOUT AAA 24/11/2012 16:30:00 AAA 25/11/2012 16:00:00 AAA 25/11/2012 20:00:00 由于技术上的原因,有些“in “和”出“,他们必须是00:00:00 我得到的结果 姓名日期小时入住时间 AAA 24/11/2012 07:30:00 16:30:00 AAA 24/11/2012 15:30 :00 16:30:00 AAA 25/11/2012 07:33:27 20:00:00 如何添加空v alues? –

+0

你的意思是缺少一条线?没有约会,没有时间? – Fionnuala

+0

是的。日期没有输入或输出 –

1

建立段,然后相交段。

SELECT 
    P1.Name, P1.date, P1.HourIN, P1.HourOUT 
FROM (
    SELECT 
    I.Name, I.date, I.HourIN, O.HourOUT 
    FROM 
    THour_IN AS I 
    LEFT JOIN THour_OUT AS O 
     ON (I.Name = O.Name) AND (I.date = O.date) 
     AND I.HourIN < H.HourOUT 
) AS P1 
INNER JOIN (
    SELECT 
    I.Name, I.date, I.HourIN, O.HourOUT 
    FROM 
    THour_IN AS I 
    LEFT JOIN THour_OUT AS O 
     ON (I.Name = O.Name) AND (I.date = O.date) 
     AND I.HourIN < H.HourOUT 
) AS P2 
    ON P1.name = P2.name AND P1.date = P2.date 
    AND P1.HourIN <> P2.HourIN and P1.HourOUT <> P2.HourOUT 
    AND P1.HourOUT > P2.HourIN 
    AND (P1.HourIN = P2.HourIN AND P1.HourOUT < P2.HourOUT 
      OR P1.HourIN > P2.HourIN AND P1.HourOUT = P2.HourOUT)