【问题标题】: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 我已经尝试了内部和外部联接,但我仍然没有得到我想要的。

标签: sql ms-access ms-access-2010


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-01-02
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2017-03-27
    • 2016-03-28
    相关资源
    最近更新 更多