首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 在行和列不固定的情情况下,关于数据库设计问题。 [已结贴,结贴人:bowlingljf]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 01:05:16 楼主
    1、有一个尺码颜色表结构如下:

    颜色尺码  小码  中码  大码
    红          10件    10件  10件                   
    黄          20件    15件  10件                   
    蓝          30件    10件  18件

    2、以上表中的尺码不固定,有些是3个码,有些是4个码或更多尺码。以上表中的颜色也是不固定,以下举例说明:

    颜色尺码  小码  中码  大码      加大码
    红          10件    10件  10件    20件               
    黄          20件    15件  10件    25件               
    蓝          30件    10件  18件    30件
    粉色        20件    15件  10件    25件               

    3、以上表目前是在Excel中处理,所以对于例和行不固定的情况下很容易就能处理,现在想用SQL来管理这些数据,请问这个表应该怎么设计?

    说明:这个表其实是反应每一款产品每一种颜色每一种尺码有多少数量,也会经常更新,有时会增加颜色或者增加尺码等。

    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jinjazz
    • 等级:
    发表于:2008-05-21 01:11:531楼 得分:40
    SQL code
    --建立测试环境 set nocount on create table test(颜色 varchar(20),尺码 varchar(20),数量 int) insert into test select '','','10' insert into test select '','','10' insert into test select '','','10' insert into test select '','加大','25' insert into test select '','','28' go --测试 declare @sql varchar(8000) set @sql='select 颜色 ' select @sql=@sql+',sum(case when 尺码='''+尺码+''' then 数量 else 0 end)['+尺码+']' from (select distinct 尺码 from test)a set @sql=@sql+' from test group by 颜色' exec(@sql) --删除测试环境 drop table test set nocount off /*-- 颜色 大 加大 小 中 -------------------- ----------- ----------- ----------- ----------- 粉 0 25 0 0 红 10 0 10 0 黄 28 0 0 10 --*/
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 01:17:012楼 得分:10
    Product
    ID         Name  
    1           Prod-A
    2           Prod-B

    Color
    ID         Name
    1           红
    2           黄
    3           蓝

    Size
    ID       Name
    1         大码
    2         中码

    ProductColor
    ID     ProductID       ColorID
    1       1(Prod-A)       1(红)  
    2       1(Prod-A)       2(蓝)    

    ProductSize
    ID     ProductID       SizeID
    1       1(Prod-A)       1(大码)  
    2       1(Prod-A)       2(中码)

    ProductRequisitionDetail
    ID       ProductColorID         ProductSizeID       Qty
    1         1(Prod-A-红)             1(Prod-A-大码)     30
    2         1(Prod-A-红)             2(Prod-A-中码)     60  
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 01:23:323楼 得分:0
    引用 1 楼 jinjazz 的回复:
    SQL code--建立测试环境
    set nocount on
    create table test(颜色 varchar(20),尺码 varchar(20),数量 int)
    insert into test select '红','小','10'
    insert into test select '红','大','10'
    insert into test select '黄','中','10'
    insert into test select '粉','加大','25'
    insert into test select '黄','大','28'
    go
    --测试
    declare @sql varchar(8000)
    set @sql='select 颜色 '
    select @sql=@sql+',sum(case …


    我已经试过动态SQL的方法,和你的结果一样,列的顺序无法控制,比如我要按小中大来排列,在具体应用中可能是S M L 或8 10 12 14等。如果顺序不对,看起来不直观。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 01:26:204楼 得分:0
    引用 2 楼 winterProgrammer 的回复:
    Product
    ID        Name 
    1          Prod-A
    2          Prod-B

    Color
    ID        Name
    1          红
    2          黄
    3          蓝

    Size
    ID      Name
    1        大码
    2        中码

    ProductColor
    ID    ProductID      ColorID
    1      1(Prod-A)      1(红) 
    2      1(Prod-A)      2(蓝)   

    ProductSize
    ID    ProductID      SizeID
    1      1(Prod-A)  …


    你这种方法我也试过了,这样的数据与我上面的格式完全不同,所以用户不能接受,然后我在这种设计的基础上还采用1楼朋友的那种动态SQL的处理方法,因为无法控制顺序,所以要另外想办法。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jinjazz
    • 等级:
    发表于:2008-05-21 01:36:275楼 得分:50
    SQL code
    --建立测试环境 set nocount on create table test(颜色 varchar(20),尺码 varchar(20),数量 int) insert into test select '','','10' insert into test select '','','10' insert into test select '','','10' insert into test select '','加大','25' insert into test select '','','28' go create table chima(尺码 varchar(20),rowindex int) insert into chima select '',1 insert into chima select '',2 insert into chima select '',3 insert into chima select '加大',4 go --测试 declare @sql varchar(8000) set @sql='select 颜色 ' select @sql=@sql+',sum(case when 尺码='''+尺码+''' then 数量 else 0 end)['+尺码+']' from (select distinct a.尺码,rowindex from test a inner join chima b on a.尺码=b.尺码 )a order by rowindex set @sql=@sql+' from test group by 颜色' exec(@sql) --删除测试环境 drop table test drop table chima set nocount off /*-- 颜色 小 中 大 加大 -------------------- ----------- ----------- ----------- ----------- 粉 0 0 0 25 红 10 0 10 0 黄 0 10 28 0 --*/
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 01:46:226楼 得分:0
    多建了一个表解决,谢谢
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved