区分一列并显示下面的其他列

时间:2010-01-30 18:09:21

标签: sql distinct

我确信我是以错误的方式看待这个。

我想在数据库中保存一个餐馆菜单并显示它。例如,我创建了一个类似于下面的表:

列:

Food_Item | Food_Description | Food_Price | Food_CAT.

数据:

沙拉|清爽的沙拉| 5.25 |首先
虾鸡尾酒|可爱的虾| 4.75 |首先
番茄汤|番茄奶油| 4.50 |汤类
牛排|可爱的臀部牛排| 10.95 |电源
鱼与鱼芯片| Classc菜| 8.75 |电源

我想要实现的是菜单布局,其中food_CAT充当标题,然后在下面显示不同的菜肴,例如:

起动
沙拉 - 5.25
虾鸡尾酒 - 4.75

汤类
番茄汤 - 4.50

电源
牛排 - 10.95
鱼与鱼芯片

等。

有没有一种简单的方法可以做到这一点,所以我没有在每个菜上面的food_cat标题,只有第一个?我以为我可以使用DISTINCT,但是通过阅读其他帖子,我知道DISTINCT一栏几乎是不可能的。

希望有人可以提供帮助。

此致 奥利弗

3 个答案:

答案 0 :(得分:1)

执行此操作的方法是在显示中,而不是在查询中。

在查询的Food_CAT语句中包含SELECT。它将包含在检索到的每条记录中。

使用ORDER BY先按Food_CAT对项目进行排序,然后按所需的列排序,可能是Food_ItemFood_Description

然后,无论您选择显示结果的任何方法,都会遍历查询,每次该字段的值发生更改时,添加仅显示Food_CAT的行。显示该标题记录后,显示与Food_CAT匹配的记录,依此类推。

答案 1 :(得分:1)

我的印象是你在SELECT语句中询问如何执行此操作,而不是使用游标。如果情况并非如此,那么使用游标可以更好地回答这些问题,这些游标可以消除我答案中的一些漂浮物。还有一些特定于报告工具的答案远比这两者都要好(但是你没有提到使用报告工具)。

关键是你有两个想要混合的数据集:

  • 标题列表
  • 项目和价格

组合它们的第一步是使数据集匹配,因此您需要将项目和价格合并为一个字符串。接下来是要包含要排序的数据,即food_cat,以及将标题排序到food_cat顶部的项目,以及下面的项目/价格字符串。你最终得到的结果如下:

select distinct food_cat as display, 
 food_cat, 
 1 as sort_order
from temp_food

union

select food_item + ' - ' + cast (food_price as varchar), 
 food_cat, 
 2
from temp_food

order by food_cat, sort_order

当然,您不希望显示此数据集中的额外列,但这是您必须在另一个级别处理的内容。

祝你好运,

特里。

答案 2 :(得分:0)

SQL在单个结果集中混合和匹配不同类型的行不是很擅长,即需要过于复杂的查询才能在单个结果集中返回数据,如下所示:

Starters | n/a
Salad | 5.25
Prawn Cocktail | 4.75
Soups | n/a
Tomato Soup | 4.50
Mains | n/a
Steak | 10.95
Fish & Chips | 8.75

最好使用JOIN水平链接数据,然后在客户端应用程序中进行一些处理,以便在菜单结构中显示数据。

SELECT Food_CAT, Food_Item, Food_Price FROM xx ORDER BY Food_CAT

然后在客户端应用程序中循环结果集,如下所示:

$foodtype = '' // a variable to store which category of food you're currently on
FOR EACH row in myresults:
  IF myresults.Food_CAT <> $foodtype // another item in the existing category
    PRINT myresults.Food_Item + myresults.Food_Price
  ELSE // new category
    $foodtype = myresults.Food_CAT
    PRINT blankline
    PRINT myresults.Food_CAT
    PRINT myresults.Food_Item + myresults.Food_Price