2012-03-21 53 views
2

我有一個練習管理軟件,它將不同的活動存儲在不同的表中。 下面列出。我試圖完成的目標是找到具有到期餘額,處於休眠狀態或在過去30天內沒有任何活動的帳戶。活動類型包括索賠提交,付款,&分類帳註釋。我用exel中的五個查詢和Vlookup函數實現了這一點。不過,我想用一個sql查詢乾淨地做到這一點。可能嗎。以下是我目前使用的五個查詢。SQL查找最近45天內沒有收集活動的帳戶

SELECT xrxTrnLgr.PatId, xrxTrnLgr.Balance, 
FROM xrxTrnLgr 
WHERE (xrxTrnLgr.Balance>$.01) 
ORDER BY xrxTrnLgr.PatId 

該查詢得到誰擁有平衡

SELECT xrxPat.PatId, xrxPat.Coverage, xrxPat.DctId, xrxPat.EntryDate 
FROM xrxPat 
WHERE (xrxPat.EntryDate>{ts '2008-01-01 00:00:00'}) 
ORDER BY xrxPat.PatId 

該查詢得到醫生編號

SELECT RecNo, xrxPatNotes.PatId, xrxPatNotes.NoteDate, xrxPatNotes.UserId 
FROM xrxPatNotes INNER JOIN 
(SELECT xrxPatNotes.PatId, Max (NoteDate) as LastDate 
FROM xrxPatNotes 
GROUP BY PatId) as B 
ON xrxPatNotes.PatId = B.PatId 
AND xrxPatNotes.NoteDate = B.LastDate 

該查詢獲得最新的總帳注

患者
SELECT xrxTrnicf.PatId, xrxTrnicf.UserId ,xrxTrnicf.PostDate 
FROM xrxTrnicf INNER JOIN 
(SELECT xrxTrnicf.PatId, Max (PostDate) as LastDate 
FROM xrxTrnicf 
GROUP BY PatId) as B 
ON xrxTrnicf.PatId = B.PatId 
AND xrxTrnicf.PostDate = B.LastDat 

此查詢是獲取最多最近索賠提交

SELECT xrxTrnpay.PatId, xrxTrnpay.UserId ,xrxTrnpay.PostDate 
FROM xrxTrnpay INNER JOIN 
(SELECT xrxTrnpay.PatId, Max (PostDate) as LastDate 
FROM xrxTrnpay 
GROUP BY PatId) as B 
ON xrxTrnpay.PatId = B.PatId 
AND xrxTrnpay.PostDate = B.LastDate 

該查詢獲取最新的付款

在EXEL我那麼VLOOKUP所有值,從今天減去。然後我創建一個列來獲取最小值。

如果有人能夠幫助我至少將sql查詢合併到一個查詢中,我將不勝感激。

謝謝

+0

你能告訴我們你的表定義爲'CREATE TABLE'語句嗎? – 2012-03-21 00:47:00

+0

我道歉,我不清楚如何做到這一點。正如我所說的,當談到SQL時,我真的是一個新手,並且從我在本網站上閱讀過的東西中將這個解決方案拼湊在一起。如果有幫助,數據將從sql server 2008中的數據庫中提取出來,並且表名爲1. xrxtrnpay 2. xrxtrnicf 3. xrxpat 4.xrxtrnlgr 5. xrxpatnotes。我不確定這是你在找什麼,所以我提前道歉,因爲我缺乏知識。 – 2012-03-21 00:54:26

+0

那麼,基於我所能看到的,我會說你遇到不同的查詢,因爲他們返回不同的/不同類型的列。如果你可以有相同的列返回,那麼一個聯盟將爲您的目的服務 – 2012-03-21 01:01:43

回答

1

您可以使用5向聯合。這是相當冗長的,但它會做的伎倆。請注意,它仍然使用五個選擇,所以它不會更有效率(實際上,我懷疑它可能效率較低)。它只是允許一個查詢有一個結果:

SELECT PatId, 
    'xrxTrnLgr' AS tablename, 
    'Balance' AS key1, Balance AS value1, 
    NULL AS key2, NULL AS value2, 
    NULL AS key3, NULL AS value3 
FROM xrxTrnLgr 
WHERE (xrxTrnLgr.Balance>$.01) 
UNION ALL 
SELECT PatId, 
    'xrxPat' AS tablename, 
    'Coverage' AS key1, Coverage AS value1, 
    'DctId' AS key2, DctId AS value2, 
    'EntryDate' AS key3, EntryDate AS value3 
FROM xrxPat 
WHERE (xrxPat.EntryDate>{ts '2008-01-01 00:00:00'}) 
UNION ALL 
SELECT PatId, 
    'xrxPatNotes' AS tablename, 
    'RecNo' AS key1, RecNo AS value1, 
    'NoteDate' AS key2, NoteDate AS value2, 
    'UserId' AS key3, UserId AS value3 
FROM xrxPatNotes INNER JOIN 
(SELECT xrxPatNotes.PatId, Max (NoteDate) as LastDate 
FROM xrxPatNotes 
GROUP BY PatId) as B 
ON xrxPatNotes.PatId = B.PatId 
AND xrxPatNotes.NoteDate = B.LastDate 
UNION ALL 
SELECT PatId, 
    'xrxTrnicf' AS tablename, 
    'UserId' AS key1, UserId AS value1, 
    'PostDate' AS key2, PostDate AS value2, 
    NULL AS key3, NULL AS value3 
FROM xrxTrnicf INNER JOIN 
(SELECT xrxTrnicf.PatId, Max (PostDate) as LastDate 
FROM xrxTrnicf 
GROUP BY PatId) as B 
ON xrxTrnicf.PatId = B.PatId 
AND xrxTrnicf.PostDate = B.LastDat 
UNION ALL 
SELECT PatId, 
    'xrxTrnpay' AS tablename, 
    'UserId' AS key1, UserId AS value1, 
    'PostDate' AS key2, PostDate AS value2, 
    NULL AS key3, NULL AS value3 
FROM xrxTrnpay INNER JOIN 
(SELECT xrxTrnpay.PatId, Max (PostDate) as LastDate 
FROM xrxTrnpay 
GROUP BY PatId) as B 
ON xrxTrnpay.PatId = B.PatId 
AND xrxTrnpay.PostDate = B.LastDate 
ORDER BY PatId 

這將返回一個結果與列(tablenamePatIdkey1value1key2value2key3value3)。 tablename結果將告訴您如何解釋鍵/值對結果。

+0

本,我試過這個,並且在關鍵字'Union'附近得到了一個錯誤的語法。我刪除了說這個查詢是爲了得到最近的聲明等的行,但仍然得到這個錯誤。有什麼建議麼? – 2012-03-21 01:16:17

+0

@MichaelSigman,oops我也刪除了說「這個查詢」的行。之後,它應該工作,你可以發佈確切的錯誤消息?上下文可能幫助我找到錯誤。 – 2012-03-21 01:22:08

+0

關鍵字'UNION'的語法不正確。我在powerpivot中添加查詢,所以這是我得到的唯一錯誤。它沒有給我更多的細節。抱歉。我非常感謝你的幫助。 – 2012-03-21 01:28:00