使用查询创建报告
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 语句来创建一个报告来回答以下查询:
- 列出动物产品中物质“PCB”的最低含量,以及
vegetables(两者都是食物类型),每年在 Sachsen 地区测量,
德国的图林根和黑森州。
- 结果应包含年份、地区和最小值。
用同样的语句,也列出
- 每年的最小值(即每年汇总所有地区)
- 以及所有年份和所有地区动物产品和蔬菜tables 中提到的区域中 PCB 的最小数量的总计。
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;
如有错误请见谅,不过看起来这可能是学校作业,所以以后思考一般原则可能会有所帮助:
找出问题陈述中的所有名词(地区名称,国家名称,食品类型名称,物质名称)并确保它们都是在查询中表示。如果它们不重要,它们可能不会在问题陈述/客户请求中提及。对于专业设置和教育设置,这是一个很好的经验法则。
通常,SELECT
中不是聚合的字段也必须在 GROUP BY
中。您可以在 GROUP BY
中包含不在 SELECT
中的字段,但这种情况很少见。
对于列出来自同一字段(例如区域)的一些项目的请求部分,使用 field IN (item1,item2,...,itemX)
允许对每个项目使用 OR
运算符.
作为附录,如果您有一个名为 Time
的维度 table,您可能希望在某些系统中将该名称用双引号括起来,以避免与通常的系统名称混淆某种形式。
我有问题。考虑 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 语句来创建一个报告来回答以下查询:
- 列出动物产品中物质“PCB”的最低含量,以及 vegetables(两者都是食物类型),每年在 Sachsen 地区测量, 德国的图林根和黑森州。
- 结果应包含年份、地区和最小值。
用同样的语句,也列出
- 每年的最小值(即每年汇总所有地区)
- 以及所有年份和所有地区动物产品和蔬菜tables 中提到的区域中 PCB 的最小数量的总计。
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;
如有错误请见谅,不过看起来这可能是学校作业,所以以后思考一般原则可能会有所帮助:
找出问题陈述中的所有名词(地区名称,国家名称,食品类型名称,物质名称)并确保它们都是在查询中表示。如果它们不重要,它们可能不会在问题陈述/客户请求中提及。对于专业设置和教育设置,这是一个很好的经验法则。
通常,
SELECT
中不是聚合的字段也必须在GROUP BY
中。您可以在GROUP BY
中包含不在SELECT
中的字段,但这种情况很少见。对于列出来自同一字段(例如区域)的一些项目的请求部分,使用
field IN (item1,item2,...,itemX)
允许对每个项目使用OR
运算符.
作为附录,如果您有一个名为 Time
的维度 table,您可能希望在某些系统中将该名称用双引号括起来,以避免与通常的系统名称混淆某种形式。