2013-03-06 12 views
1

下面我有這個樣本數據(表1):我怎樣才能獲得最大日期(每個主鍵)並從另一個表中獲得差異?

PKEY DATE 
---- ---- 
ABC1 2/13 
CFG5 1/05 
POK9 1/10 

,我有另一個表這些日期(表2):

PKEY REF# DATE 
---- ---- ---- 
1  ABC1 2/14 
2  ABC1 2/20 
3  ABC1 3/01 
4  CFG5 3/05 
5  CFG5 2/10 
6  ABC1 2/25 

我想從表2得到最大日期每REF#)並獲得差異與從表1日期。顯示下面的結果。

REF# DIFF 
---- ---- 
POK9 55 
CFG5 54 
ABC1 21 [ *note: this is equal to datediff(day,table1.DATE,getdate()) ] 

*另外,我想使用的日期今天(與從表1日起扣除)如果樓盤編號沒有在表2現有的(像上面例子中的第3行)。希望這是有道理的..讓我知道如果有什麼不清楚,所以我可以編輯馬上..

**更新: 這是我迄今爲止嘗試..但仍然不完整..感謝辛勤工作

select t1.[REF#] 
from table1 as t1 
join table2 as t2 
on t1.[REF#] COLLATE DATABASE_DEFAULT = t2.[REF#] COLLATE DATABASE_DEFAULT 
+0

我已經更新了帖子..謝謝 – 2013-03-06 07:55:35

回答

1
SELECT t1.PKEY, CASE WHEN o.DATE IS NULL 
        THEN DATEDIFF(DAY, t1.DATE, GETDATE()) 
        ELSE DATEDIFF(DAY, t1.DATE, o.DATE) END AS DIFF 
FROM dbo.table1 t1 OUTER APPLY (
           SELECT MAX(t2.Date) AS Date 
           FROM dbo.table2 t2  
           WHERE t1.PKEY = t2.REF# 
           ) o 

演示上SQLFiddle

或不適用()運算

SELECT t1.PKEY, (SELECT CASE WHEN MAX(o.Date) IS NULL 
          THEN DATEDIFF(DAY, t1.Date, GETDATE()) 
          ELSE DATEDIFF(DAY, t1.Date, MAX(o.Date)) END AS DIFF 
       FROM dbo.test27 o 
       WHERE t1.PKEY = o.REF# 
       ) AS DIFF        
FROM dbo.test26 t1 

查詢與您的標準

SELECT * 
FROM (
     SELECT t1.PKEY, (SELECT CASE WHEN MAX(o.Date) IS NULL 
           THEN DATEDIFF(DAY, t1.Date, GETDATE()) 
           ELSE DATEDIFF(DAY, t1.Date, MAX(o.Date)) END AS DIFF 
         FROM dbo.test27 o 
         WHERE t1.PKEY = o.REF# 
         ) AS DIFF        
     FROM dbo.test26 t1 
    ) s 
WHERE s.DIFF BETWEEN 110 AND 120 
+0

我得到錯誤,「關鍵字'OUTER'附近的語法錯誤。錯誤代碼156」 – 2013-03-06 08:19:37

+0

我真的不知道我在哪裏它錯了..我試圖比較它與SQLFiddle中的演示..但我的代碼似乎並沒有工作..這是我的代碼 --- SELECT t1.CaseNo,CASE WHEN o.med_stateff IS NULL THEN DATEDIFF (DAY,t1.DatePIConsult,GETDATE()) ELSE DATEDIFF(DAY,t1.DatePIConsult,o.med_stateff)END AS DIFF FROM data2002.dbo.tblCrew T1 OUTER APPLY( \t \t \t \t \t \t \t \t SELECT MAX (t2.med_stateff)AS Date FROM eds.dbo.tblpms t2 WHERE t1.CaseNo = t2.CaseNo ) – 2013-03-06 08:31:45

+0

我不確定..bt也許我得到的錯誤,因爲我的兩個表來自不同的數據庫.. TT。我怎樣才能使這項工作?..這是我更新的代碼 ---- SELECT t1.CaseNo,CASE WHEN o.Date IS NULL THEN DATEDIFF(DAY,t1.DatePIConsult,GETDATE()) ELSE DATEDIFF(DAY,t1.DatePIConsult,o.Date)END AS DIFF FROM data2002.dbo.tblCrew T1 OUTER APPLY( \t \t \t \t \t \t \t \t SELECT MAX(t2.med_stateff)AS Date FROM eds.dbo.tblpms t2 WHERE t1.CaseNo = t2.CaseNo ) – 2013-03-06 08:37:14

2
WITH recorddates 
AS 
(
    SELECT PKEY, REFNo, DATE, 
      ROW_NUMBER() OVER (PARTITION BY RefNO 
           ORDER BY DATE DESC) rn 
    FROM table2 
) 
SELECT a.PKEY, 
     datediff(day,a.DATE,b.date) 
FROM table1 a 
     INNER JOIN recorddates b 
      ON a.PKey = b.RefNo 
WHERE b.rn = 1 
+0

讓我先試試這個..謝謝 – 2013-03-06 07:58:45

1

像這樣的事情?

select a.pkey 
     ,datediff(day, max(a.date), coalesce(max(b.date), getdate())) as diff 
    from table1  a 
    left join table2 b on(b.ref# = a.pkey) 
group 
    by a.pkey; 

編輯的評論: 你應該能夠過濾這樣的:

select a.pkey 
     ,datediff(day, max(a.date), coalesce(max(b.date), getdate())) as diff 
    from table1  a 
    left join table2 b on(b.ref# = a.pkey) 
group 
    by a.pkey 
having datediff(day, max(a.date), coalesce(max(b.date), getdate())) between 110 
                     and 120; 

或包裹這樣的statment:

select * 
    from (select a.pkey 
       ,datediff(day, max(a.date), coalesce(max(b.date), getdate())) as diff 
      from table1  a 
      left join table2 b on(b.ref# = a.pkey) 
     group 
      by a.pkey 
     ) 
where diff between 110 and 120; 
+0

偉大!但...我需要過濾掉(不包括)一些裏nes with null a.date ..這個查詢仍然有'diff'列中的空行。感謝Ronnis提前 – 2013-03-06 08:43:09

+0

好吧我知道了..但是我可以把這個「WHERE diff在110和120之間」嗎?我在複製where子句中的整個聚合函數時遇到錯誤..它說:「聚合 可能不會出現在WHERE子句中,除非它位於包含在HAVING子句或選擇列表中的子查詢 中,而 列彙總是一個外部參考。「 – 2013-03-06 08:49:05

+0

@ E-rGabrielDoronila,你可以把表達式放在having子句中或者用另一個語句包裝它。我用例子更新了答案。 – Ronnis 2013-03-06 09:35:47

相關問題