MS Access:查询以组合行

Posted

技术标签:

【中文标题】MS Access:查询以组合行【英文标题】:MS Access: Query to combine rows 【发布时间】:2013-10-18 14:45:51 【问题描述】:

我有 3 张桌子:

客户 User_Defined_Definitions User_Defined_Data

Clients 表有基本信息:

ClientID, Name, Address...

User_Defined_Definitions 具有用户定义字段的标题:

StartDate, SalesRep, Website...

然后User_Defined_Data 表包含用于填充客户端表中每个客户端的这些字段的数据。

我已经构建了一个查询,它提取了我需要的所有数据,但它为该客户端存在的每个 User_Defined_Data 行提取了一行。我想做的是为每个客户端拉一行,并根据需要附加尽可能多的列,以将所有用户定义的字段填充到一行中。

ClientID Name   Address     Description Data
155555   Calvin 123 Fake St StartDate   10/10/2013
155555   Calvin 123 Fake St SalesRep    Tom
155555   Calvin 123 Fake St Website     http://www.fakesite.com
155556   Steve  456 Root Rd StartDate   8/5/2013
155557   Kathy  715 Main St StartDate   5/5/2010
155557   Kathy  715 Main St SalesRep    Jessica
155557   Kathy  715 Main St Website     http://www.fakesite2.com
155558   Jenny  345 Fake St StartDate   9/9/2012
155558   Jenny  345 Fake St Website     http://www.fakesite3.com

前三列来自Client 表。 Description 列来自User_Defined_Definitions 表。而Data 来自User_Defined_Data 表。

我希望看到它与此类似

ClientID    Name    Address StartDate   SalesRep    Website
155555  Calvin  123 Fake St 10/10/2013  Tom         http://www.fakesite.com
155556  Steve   456 Root Rd 8/5/2013        
155557  Kathy   715 Main St 5/5/2010    Jessica     http://www.fakesite2.com
155558  Jenny   345 Fake St 9/9/2012                http://www.fakesite3.com

我知道这可以使用 sql,但我通常只是编写脚本来处理导出后的数据。但这次我需要能够在 Access 中完成,这样表可以在 2 个月后重新打开,它会以相同的方式重新查询数据。

如果我还能提供什么帮助获得正确的结果,请告诉我。

插件

我走了很长的路,对每个 UDF 进行了单独的查询,然后通过对每个 UDF 运行查询来合并它们,将它们全部放在一行中。不过,我仍然很好奇如何使用 SQL 做到这一点,因为现在我正在为我的组织更改 CRM 和会计软件,这已成为一项艰巨的任务。

这是我用来将 UDF 拉到上面概述的单独行的查询。

SELECT dbo_AMGR_Client_Tbl.Client_Id, dbo_AMGR_Client_Tbl.Name,
dbo_AMGR_Client_Tbl.Address_Line_1, dbo_AMGR_Client_Tbl.Address_Line_2, 
dbo_AMGR_Client_Tbl.City, dbo_AMGR_Client_Tbl.State_Province, 
dbo_AMGR_Client_Tbl.Zip_Code, dbo_AMGR_User_Field_Defs_Tbl.Description, 
dbo_AMGR_User_Fields_Tbl.DateCol, dbo_AMGR_User_Fields_Tbl.NumericCol, 
dbo_AMGR_User_Fields_Tbl.AlphaNumericCol
FROM dbo_AMGR_User_Field_Defs_Tbl INNER JOIN (dbo_AMGR_Client_Tbl INNER JOIN 
dbo_AMGR_User_Fields_Tbl ON dbo_AMGR_Client_Tbl.Client_Id = 
dbo_AMGR_User_Fields_Tbl.Client_Id) ON (dbo_AMGR_User_Field_Defs_Tbl.Type_Id = 
dbo_AMGR_User_Fields_Tbl.Type_Id) AND (dbo_AMGR_User_Field_Defs_Tbl.Code_Id = 
dbo_AMGR_User_Fields_Tbl.Code_Id)
GROUP BY dbo_AMGR_Client_Tbl.Name_Type, dbo_AMGR_Client_Tbl.Client_Id, 
dbo_AMGR_Client_Tbl.Name, dbo_AMGR_Client_Tbl.Address_Line_1, 
dbo_AMGR_Client_Tbl.Address_Line_2, dbo_AMGR_Client_Tbl.City, 
dbo_AMGR_Client_Tbl.State_Province, dbo_AMGR_Client_Tbl.Zip_Code, 
dbo_AMGR_User_Field_Defs_Tbl.Description, dbo_AMGR_User_Fields_Tbl.DateCol, 
dbo_AMGR_User_Fields_Tbl.NumericCol, dbo_AMGR_User_Fields_Tbl.AlphaNumericCol
HAVING (((dbo_AMGR_Client_Tbl.Name_Type)="C") AND ((dbo_AMGR_Client_Tbl.Name) Not Like "*HOUSE*"))
ORDER BY dbo_AMGR_Client_Tbl.Name;

【问题讨论】:

您可以发布您现有的查询吗? 【参考方案1】:

User_Defined_Data 表中,您似乎有多行与一个clientID 相关。

您为什么不重建该表,使其包含您需要的所有字段并且与Clients 一对一?

否则,您可以在查询中使用CASE 语句并通过description 过滤其内容。

【讨论】:

您将如何使用 CASE 语句而不是描述。我明白您对“如果此行的描述等于 SalesRep,则将其放在第 13 列等”的意思,但是您会怎么做呢?谢谢 实际上在 MS Access 中你会使用 Iif() 语句而不是 case (MS SQL)。通常使用访问是一种痛苦。您可以分享实际的数据库或列出 3 个表示例吗?我可能误解了您最初的问题,但如果我有包含数据的实际表格,我可以看看是否可以提供帮助。

以上是关于MS Access:查询以组合行的主要内容,如果未能解决你的问题,请参考以下文章

使用单个表单组合框中的多列作为 MS Access 中的查询参数

MS Access 组合框和 NVDA

MS Access:组合框重新查询

MS-Access 中的未嵌套行?

带有行着色的MS Access VBA列表框?

从 MS Access 数据库行填充 VB 组合框