假设我有一个名为FOOD
的表,另一个名为FOOD_TYPE
。
FOOD_TYPE
有两列FOOD_TYPE_ID和FOOD_TYPE_NAME
。
FOOD_TYPE_NAME
有两个值= CHOCOLATES AND ICE-CREAMS
。
FOOD_TYPE_ID
是pk到FOOD_TYPE
和fk到FOOD
。
我使用以下查询来获取FOOD中的冰淇淋和巧克力的数量
select
sum(case when FOOD_TYPE_NAME = 'ICE-CREAMS' then 1 else 0 end) "NUMBER OF ICECREAMS",
sum(case when FOOD_TYPE_NAME = 'CHOCOLATES' then 1 else 0 end) "NUMBER OF CHOCOLATES"
from FOOD
inner join food_type on...
group by ..... (not adding the rest)
我的问题是,如果我在food_type_name中添加另一个值,例如 - CHIPS我是否需要写另一个总和(case)来查找筹码数量,或者无论如何都要编写一个查询,它将自动为FOOD_TYPE的所有值执行此操作。我的要求就像
select
sum(for a particular value of food_type) as "NUMBER OF" + FOOD_TYPE.FOOD_TYPE_NAME
答案 0 :(得分:1)
我认为实现您尝试做的最好的方法是这样的查询:
select food_type_name, count(*) from food ... group by food_type_name
这会将结果生成为行而不是列,但我并不是真的看到将它放在列中的重点:在任何情况下都会更难以处理,因为您需要引用结果集元数据来找出列是什么,这样所有更改的数据都是表数据的一部分,而不是表格布局的一部分。
答案 1 :(得分:0)
当然,通常情况下,你会获得行而不是列
的数据SELECT food_type_name, count(*)
FROM food
JOIN food_type USING (food_type_id)
GROUP BY food_type_name
并且如果有必要,让您使用任何工具来显示数据句柄旋转。
如果要转动数据以便查询总是返回1行,并且列数随数据而变化,那么您可能希望使用PIVOT
子句而不是SUM
子句。 1}}假设您现在使用的任何数据库版本都支持它。这仍然需要您明确列出您正在转动的值,因为数据库需要知道在执行查询之前结果集中将有多少列。但它会使维护更容易。
如果要使列数动态化,则需要使用动态SQL或一些真正模糊的特定于数据库的过程功能(即在Oracle中,您可以使用返回{的函数执行某些操作。 {1}})。这些选项中的任何一个都可能使您的代码复杂化,但如果您要定期添加AnyDataSet
值,则可以使维护更容易。当然,这假设您的查询的使用者知道如何处理动态添加和删除的列。