使用查询创建报告

Create a report with an query

我有问题。考虑 ROLAP 系统中的以下事实和维度 tables,该系统收集在超市销售的食品中测得的有害物质的值。

事实table:

• Contaminants (TimeID, ShopID, FoodID, substance, quantityPerOunce)
This describes which harmful substance in which quantity was found on a given
food in a given supermarket at a given time.

维度tables:

• Time (TimeID, dayNr, dayName, weekNr, monthNr, year)
• Food (FoodID, foodName, brand, foodType)
  Example data: (43, egg, Bioland, animalProduct)
• Place (ShopID, name, street1, region, country)

编写一个 SQL 语句来创建一个报告来回答以下查询:

用同样的语句,也列出

SQL查询

SELECT years, regions, min(quantityPerOunce)
FROM Contaminants as c, Time as t, Food as f, Place as p
WHERE c.TimeID = t.TimeID
AND c.FoodID = f.FoodID
AND c.ShopdID = p.ShopID
AND substance = "PCB"
AND foodType = "vegetables"
AND foodType = "animalProducts"
GROUP BY regions;

这种题不知道怎么解。我试过了,但我不知道。连接 应该是 Equi-Join 即使这不是最好的方式。

你很接近。首先,请记住,在 GROUP BY 查询中,SELECT 中的非聚合字段也必须出现在 GROUP BY 行中。所以,你应该:

GROUP BY years, regions;

此外,如果你使用这个:

foodType = 'vegetables' AND foodType = 'animalProducts'

查询将 return 什么都没有,因为 foodType 不能同时是两者。

因此,您需要这个:

(foodType = 'vegetables' OR foodType = 'animalProducts')

或者:

foodType IN ('vegetables','animalProducts')

您的查询假定区域仅包含列出的三个区域。如果您对此不是 100% 确定,最好使用以下方式明确指定它们:

AND regions IN ('Sachsen', 'Thüringen', 'Hessen')

仅此一项还假设这些地区仅在德国。这可能是真的。虽然可能不是,所以最安全的是也添加:

AND country = 'Germany'

所以,按照这些思路:

SELECT years, regions, MIN(quantityPerOunce) AS min_quantityPerOunce
FROM Contaminants as c, Time as t, Food as f, Place as p
WHERE c.TimeID = t.TimeID
AND c.FoodID = f.FoodID
AND c.ShopdID = p.ShopID
AND substance = 'PCB'
AND foodType IN ('vegetables','animalProducts')
AND regions IN ('Sachsen', 'Thüringen', 'Hessen')
AND country = 'Germany'
GROUP BY years, regions;

如有错误请见谅,不过看起来这可能是学校作业,所以以后思考一般原则可能会有所帮助:

  1. 找出问题陈述中的所有名词(地区名称,国家名称,食品类型名称,物质名称)并确保它们都是在查询中表示。如果它们不重要,它们可能不会在问题陈述/客户请求中提及。对于专业设置和教育设置,这是一个很好的经验法则。

  2. 通常,SELECT 中不是聚合的字段也必须在 GROUP BY 中。您可以在 GROUP BY 中包含不在 SELECT 中的字段,但这种情况很少见。

  3. 对于列出来自同一字段(例如区域)的一些项目的请求部分,使用 field IN (item1,item2,...,itemX) 允许对每个项目使用 OR 运算符.

作为附录,如果您有一个名为 Time 的维度 table,您可能希望在某些系统中将该名称用双引号括起来,以避免与通常的系统名称混淆某种形式。