这样的SQL语句应如何写? ( 积分: 50 )

  • 主题发起人 主题发起人 chengcheng178
  • 开始时间 开始时间
C

chengcheng178

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库字段为bianhao,fuzhuang,cailiao1,cailiao2,cailiao3,bianhao和fuzhuang是一对多的关系,就是说每一个bianhao有多种服装,而每一种服装下有3种材料可填写,数据库记录如下:
bianhao fuzhuang cailiao1 cailiao2 cailiao3
001 女西装 毛料 化纤 纯棉
001 女休闲装 丝麻 化纤 纯棉
002 男西装 毛料 化纤 纯棉
002 男休闲装 丝麻 人棉 纯棉
我想在前台提出不同编号相对应的全部不同材料的记录,显示记录如下:
001 毛料 化纤 纯棉 丝麻
002 毛料 化纤 纯棉 丝麻 人棉
这样的语句该怎么写,谢谢各位大侠了!
 
数据库字段为bianhao,fuzhuang,cailiao1,cailiao2,cailiao3,bianhao和fuzhuang是一对多的关系,就是说每一个bianhao有多种服装,而每一种服装下有3种材料可填写,数据库记录如下:
bianhao fuzhuang cailiao1 cailiao2 cailiao3
001 女西装 毛料 化纤 纯棉
001 女休闲装 丝麻 化纤 纯棉
002 男西装 毛料 化纤 纯棉
002 男休闲装 丝麻 人棉 纯棉
我想在前台提出不同编号相对应的全部不同材料的记录,显示记录如下:
001 毛料 化纤 纯棉 丝麻
002 毛料 化纤 纯棉 丝麻 人棉
这样的语句该怎么写,谢谢各位大侠了!
 
select cailiao1,cailiao2,cailiao3 from yourtable where bianhao=查询编号
 
按上面的写就会提出重复材料记录呀
我想提出这样的记录应如何写,谢谢各位
001 毛料 化纤 纯棉 丝麻
002 毛料 化纤 纯棉 丝麻 人棉
 
select distinct cailiao1,cailiao2,cailiao3 from yourtable where bianhao=查询编号
 
只用简单的SQL语句是无法实现的,与可以用临时表或者存储过程配合实现
 
能说的具体一些吗?,请把相对应的SQL语句写一下,谢谢!
 
为什么要这样定义表结构呢,为什么女西装和女休闲装编号都是001呢,这样定义有什么意义呢
 
这个表里有很多的字段,还和其它的表有关联,我现在只是写出了一部分
数据库中的记录如下:
bianhao fuzhuang cailiao1 cailiao2 cailiao3
001 女西装 毛料 化纤 纯棉
001 女休闲装 丝麻 化纤 纯棉
002 男西装 毛料 化纤 纯棉
002 男休闲装 丝麻 人棉 纯棉
要前台提出不同编号相对应的全部不同材料的记录:
显示记录如下:
001 毛料 化纤 纯棉 丝麻
002 毛料 化纤 纯棉 丝麻 人棉
这样的语句应如何写?谢谢!
 
材料一共有多少种?有上限吗?
 
各个编号对应的材料数目不确定
001对应4种
002对应5种
003对应8种
但一个编号最多不会超出50种
 
select distinct bianhao,cailiao
from (select bianhao,cailiao1 as cailiao from Table
union select bianhao,cailiao2 as cailiao from Table
union select bianhao,cailiao3 as cailiao from Table
) a
这个可以得到打坚的,如
bianhao cailiao
001 毛料
001 化纤
001 纯棉
001 丝麻
002 毛料
002 化纤
002 纯棉
002 丝麻
002 人棉
然后再处理成横向的就可以了
 
mk1024的方法就够简单的了,按那个表的结构用SQL也只能这样查询,然后再将材料在程序中输出成横向的
 
你在定义代码时就不问题,相同的代码怎么非要表示出四种类型的东东呢!
改一下定义,可能会更好,或者用临时库
 
哥们,横向如何写呀?
 
我也关注这个问题
up
 
在mk1024的基础上
我来提供横向写的方法,研究一下下面的存储过程你可以得到解决这个问题的思路。
肯定管用,在SQL里面我感觉这样的东东应该叫交叉报表吧。你可以看看。我只动一点点拉[:D]
SQL实现交叉表的方法?
交叉一般来讲是分组统计的一种,形式更复杂,显示更清淅,但数据库本身并没有提供实现交叉表的功能,自己创建交叉表不仅要对过程、游标、临时表、动态SQL等非常熟悉,而且思路也要清淅,本例以PUBS.DBO.SALES表的数据做样本:
CREATE PROCEDURE UP_TEST(
@T1 VARCHAR(30),@T2 VARCHAR(30),
@T3 VARCHAR(30),@T4 VARCHAR(30)) AS
--T1 表名,T2,T3是交叉表的两上分类字段,T4是汇总字段
--T2是行字段,T3列字段
begin
DECLARE @SQL VARCHAR(7999),@FIELD VARCHAR(30)
SELECT @SQL='SELECT DISTINCT '+@T3+' FROM '+@T1
CREATE TABLE #FIELD(FIELD VARCHAR(30))
--将列字段提取到临时表#FIELD中
INSERT INTO #FIELD EXEC(@SQL)
SELECT @SQL='CREATE TABLE CROSS_TEST('+@T2+' VARCHAR(30),'
DECLARE CUR_FIELD CURSOR LOCAL FOR SELECT * FROM #FIELD
OPEN CUR_FIELD
FETCH CUR_FIELD INTO @FIELD
WHILE @@FETCH_STATUS=0 begin
SELECT @FIELD='['+@FIELD+']'
SELECT @SQL=@SQL+@FIELD+' DECIMAL(8,2) DEFAULT 0,'
FETCH CUR_FIELD INTO @FIELD
END
SELECT @SQL=LEFT(@SQL,LEN(@SQL)-1)+')'
--创建临时交叉表CROSS_TEST
EXEC(@SQL)
SELECT @SQL='INSERT INTO CROSS_TEST('+@T2+') SELECT DISTINCT '+@T2+' FROM '+@T1
--将行数据存入交叉表#CROSS_TEST
EXEC(@SQL)
--创建分组数据表TEMP
SELECT @SQL='CREATE TABLE TEMP('+@T2+' VARCHAR(30),'+@T3+' VARCHAR(30),'+@T4+' DECIMAL(8,2))'
EXEC(@SQL)
--将交叉汇总数据放入交叉表
SELECT @SQL='SELECT '+@T2+','+@T3+', SUM(QTY) QTY FROM '+@T1 +' GROUP BY '+@T2+','+@T3
INSERT INTO TEMP EXEC(@SQL)
--将汇总数据写入交叉表
DECLARE CUR_SUM CURSOR LOCAL FOR SELECT * FROM TEMP
DECLARE @F1 VARCHAR(30),@F2 VARCHAR(30),@QTY DECIMAL(8,2),@Q1 VARCHAR(30)
OPEN CUR_SUM
FETCH CUR_SUM INTO @F1,@F2,@QTY
WHILE @@FETCH_STATUS=0 begin
SELECT @F2='['+@F2+']',@Q1=CAST(@QTY AS VARCHAR(30))
SELECT @SQL='UPDATE CROSS_TEST SET '+@F2+'='+@Q1+' WHERE '+@T2+'='''+@F1+''''
EXEC(@SQL)
FETCH CUR_SUM INTO @F1,@F2,@QTY
END
CLOSE CUR_SUM
SELECT * FROM CROSS_TEST
DROP TABLE TEMP
DROP TABLE CROSS_TEST
DROP TABLE #FIELD
END
--------------------------------------------------------
EXEC UP_TEST 'SALES','TITLE_ID','STOR_ID','QTY'
 

Similar threads

后退
顶部