如果列重复,SQL查询将停止工作

时间:2018-08-15 22:40:36

标签: sql sql-server

我有一个这样的Datagridview:

Model  day1  day2  day3
 car    1     2      4
 bike   2     3      5
 ship   6     1      7

然后我将其保存在我的数据库表中,如下所示:

    date   model   qty id
    day1    car     1   1
    day2    car     2   2
    day3    car     4   3
    day1    bike    2   4
    day2    bike    3   5
    day3    bike    5   6
    day1    ship    6   7
    day2    ship    1   8
    day3    ship    7   9

然后使用此查询:

Select Min(id) As id,model From table Group By model order by id 

我获得的模型列表与在datagridview中获得模型的顺序相同:

car
bike
ship

当我在表中保存两个具有相同名称的模型然后执行查询时,问题就来了,我希望得到这个:

1 car
2 bike
3 ship
4 car

但是我得到了这个:

1 car
2 bike
3 ship

当前设计的第二个问题是,如果我设法以某种方式在datagrid视图中检索列表:

car
bike
ship
car

即时消息我怎么知道哪些来自第一个“汽车”,哪些来自最后一个“汽车”,所以我可以再次将它们放回datagridview。

在简历中,我想以保存数据时的顺序显示在数据网格中,但我不知道问题出在表的设计还是查询中。

示例:

将其保存在我的表格中,然后执行查询以获取相同格式的相同信息:

   Model  day1  day2  day3
     car    1     2      4
     bike   2     3      5
     ship   6     1      7
     car    1     2      4

2 个答案:

答案 0 :(得分:1)

问题是您的查询,您正在按model分组 这意味着它将获得该型号所有汽车的最小Id,因此您有两次汽车,但仅显示一次,因为它将model汽车的所有记录分组并选择了最小Id,即1

尝试一下:

Select Count(id) As ModelCount,model From table Group By model order by id 
在具有四辆汽车的数据集上

,您会发现它将返回以下内容:

ModelCount | model
         2 | car
         1 | bike
         1 | ship

答案 1 :(得分:0)

根据您的描述,这是一个“孤岛”问题。实际上,这是一个数据表示问题。为什么要用单个ID而不是行ID和列ID存储数据?

鉴于对数据进行排序的方式,您可以减去序列以识别组。然后,您可以group by并获取原始行:

select model
from (select t.*, row_number() over (partition by model order by id) as seqnum
      from t
     ) t
group by model, (id - seqnum)
order by min(id);

但是让我强调一下,如果您想要行/列信息,那么那就是您应该存储在数据库中的内容。