您好,我正在尝试在MS Access 2016中构建查询。我有一个索赔号的主列表(约400万个索赔)。我有6个其他供应商的表。每个都有索赔号,付款年和付款金额。附图提供了我想要完成的简化示例。最终结果将包含该年度该索赔的每个供应商付款的索赔号,付款年和六个付款额列。我对SQL不是很熟悉,但我认为我需要用它来完成这个。我试图通过创建一个包含索赔号和所有可能的付款年组合的表来强制它。这将为我提供必要的两个字段来加入其他表。但是,它超过了2G的大小限制。任何建议,将不胜感激。感谢。
答案 0 :(得分:0)
数据库结构未规范化,但无论如何,试试这个:
with cl_y as
(Select ClaimNo, Year
From m,v1,v2
Where m.claimno = v1.claimno
And m.claimno = v2.claimno)
Select ClaimNo,Year,v1.Payment,v2.Payment,(v1.Payment + v2.Payment) as Total
From cl_y
Left Outer Join v1 ON cl_y.ClaimNo = v1.ClaimNo
Left Outer Join v2 On cl_y.ClaimNo = v2.ClaimNo
答案 1 :(得分:0)
我同意maSTA,不是理想的设计。应该是所有供应商声明的一个表,其中包含VendorID的另一个字段。但是,您可以复制'规范化'通过使用6个供应商表构建UNION查询来构建结构。必须在查询构建器的SQLView中构建UNION查询。
SELECT ClaimNo, [Year] AS YearPay, Payment, "Vendor1" AS Vendor FROM Vendor1
UNION SELECT ClaimNo, [Year], Payment, "Vendor2" FROM Vendor2
UNION SELECT ClaimNo, [Year], Payment, "Vendor3" FROM Vendor3
UNION SELECT ClaimNo, [Year], Payment, "Vendor4" FROM Vendor4
UNION SELECT ClaimNo, [Year], Payment, "Vendor5" FROM Vendor5
UNION SELECT ClaimNo, [Year], Payment, "Vendor6" FROM Vendor6
UNION SELECT ClaimNo, Null, Null, Null FROM Master;
然后在CROSSTAB查询中使用该查询以“反规范化”#39;通过转动到所需的结果。添加从Master获取的SELECT行应允许包含尚未付款的索赔。
建议的CROSSTAB:
TRANSFORM First(ClaimUNION.[Payment]) AS FirstOfPayment
SELECT ClaimUNION.[ClaimNo], ClaimUNION.[YearPay], Sum(ClaimUNION.[Payment]) AS TotalPayment
FROM ClaimUNION
GROUP BY ClaimUNION.[ClaimNo], ClaimUNION.[YearPay]
PIVOT ClaimUNION.[Vendor];
这样做的一个缺点可能是即使是有付款的索赔也会有空行。另一种方法是不在UNION中包含Master,而是在第三个查询中将CROSSTAB加入Master。或者将UNION加入Master并在其上构建CROSSTAB:
TRANSFORM First(ClaimUNION.Payment) AS FirstOfPayment
SELECT Master.ClaimNo, ClaimUNION.YearPay, Sum(ClaimUNION.Payment) AS
TotalPayment
FROM ClaimUNION RIGHT JOIN Master ON ClaimUNION.ClaimNo = Master.ClaimNo
GROUP BY Master.ClaimNo, ClaimUNION.YearPay
PIVOT ClaimUNION.Vendor;
年份是Access中的保留字。不应该使用保留字作为任何名称,更好的是YearPay。