强制查询为查找表中的每个值生成记录

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

【讨论】:

以上是关于强制查询为查找表中的每个值生成记录的主要内容,如果未能解决你的问题,请参考以下文章

在表中为每个数据库查找具有空值的列[关闭]

创建最佳查询以查找仅在一个表中的记录

Access 中的查找值

用于查找一个表中但不在另一个表中的行的 MySQL 查询

sql查询 如何获取查找某ID的一条记录在表中是第几条记录

访问 2007 引用完整性而不使用表中的查找