强制查询为查找表中的每个值生成记录
Posted
技术标签:
【中文标题】强制查询为查找表中的每个值生成记录【英文标题】:force query to produce records for each value in lookup table 【发布时间】:2016-01-12 16:31:47 【问题描述】:我有一个带有数据表的 1 到 N 查找表。查找表有
例如,查找表包含 (Dog, Cat, Bird, Exotic)
数据表有以下字段。 房子、动物类型、数量
如果我有这样的数据
house animal_type quantity
1 dog 1
1 cat 1
2 dog 2
3 exotic 1
如何获得将产生以下内容的查询? (列标题的顺序无关紧要)。
house dog cat bird exotic
1 1 1 0 0
2 2 0 0 0
3 0 0 0 1
我知道
IIF([animals].[quantity] is null,0,[animals].[quantity])
但它不会为每种动物类型产生零记录,即使它不在那个房子里。
【问题讨论】:
可以分享一下SQL吗?听起来查找表的联接是内部联接而不是外部联接。 @RobPaller 我已经尝试了内部和外部联接,但我仍然没有得到我想要的。 【参考方案1】:您可以通过交叉表查询获得所需的信息。请参阅 Access 帮助主题:TRANSFORM 语句 (Microsoft Access SQL)。并查看 Access Crosstab 查询向导 以开始使用。
您似乎想要一列鸟,即使没有房子有。所以将IN ('dog', 'cat', 'bird', 'exotic')
添加到PIVOT
子句中:
TRANSFORM Sum(data_table.[quantity]) AS SumOfquantity
SELECT data_table.[house]
FROM data_table
GROUP BY data_table.[house]
PIVOT data_table.[animal_type] IN ('dog', 'cat', 'bird', 'exotic');
当house
没有animal_type
的记录时,该查询返回Null 而不是零。如果您更喜欢零而不是 Null,请包括 Nz()
:
TRANSFORM Nz(Sum(data_table.[quantity]), 0) AS SumOfquantity
通过该查询,Access 2010 会根据您的示例数据为我提供以下结果集:
【讨论】:
这已经非常接近我的需要了。我尝试了 PIVOT data_table.[animal_type] IN (SELECT * FROM [animal_type]) 但它不起作用,这让我相信 IN 必须是一个数组。如何让数组动态填充? 您不能动态填充它。您可以使用 VBA 过程来检查查找表的内容并在需要时更改 SQL 语句文本。 在你们的帮助下,我终于到达了我想要的地方。我不知道列标题属性,所以我去寻找并找到下面的链接。基本上它是一个三个查询过程,一个是右连接,然后是一个删除空行的最终查询。 msdn.microsoft.com/en-us/library/office/… 如果没有IN
部分,列将按字母顺序排列,而不是按照您所要求的问题的“狗”、“猫”、“鸟”、“异国情调”的顺序。如果您实际上并不关心列顺序,请编辑问题以澄清这一点。谢谢。【参考方案2】:
您可以在 MS Access 中使用TRANSFORM
运算符来解决您的任务。
TRANSFORM Nz(SUM(quantity), 0)
SELECT house FROM Test
GROUP BY house
PIVOT animal_type
这个查询的输出
您可以在此处找到有关它的更多信息 (https://msdn.microsoft.com/en-us/library/bb208956(v=office.12).aspx)
【讨论】:
这与我要查找的内容很接近,但请注意缺少标题“鸟”。鸟下的每个房子都应该是零。 没有名称为“bird”的标题,因为我的测试数据没有它。如果您想在任何情况下使用此标题,请查看@HansUp 解决方案。【参考方案3】:以下链接逐步解释了如何获取交叉表查询以显示动态标题,即使该标题没有关联数据。
How to Tame the Crosstab Missing Column Beast
【讨论】:
以上是关于强制查询为查找表中的每个值生成记录的主要内容,如果未能解决你的问题,请参考以下文章