2012-03-21 44 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