SQL - 访问表的列的通用方法

时间:2014-05-17 22:35:23

标签: mysql sql sql-server oracle

假设我有一个名为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

2 个答案:

答案 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值,则可以使维护更容易。当然,这假设您的查询的使用者知道如何处理动态添加和删除的列。