精華答題收藏之邏輯難題(字符拆分)

          IF OBJECT_ID('dbo.統計表') IS NOT NULL DROP TABLE 統計表
          CREATE TABLE 統計表 (方便面 INT,茶葉 INT,面包 INT,口香糖 INT,牛奶 INT,玻璃杯 INT,可樂 INT,冰糖 INT,牙膏 INT,牙刷 INT,故事書 INT,味素 INT,食鹽 INT,榨菜 INT,食醋 INT)
          INSERT INTO 統計表
          SELECT 1,0,0,0,0,1,0,0,0,1,0,0,1,0,0 UNION ALL
          SELECT 1,1,0,0,0,1,0,0,0,0,1,1,0,1,0 UNION ALL
          SELECT 0,1,1,1,0,1,1,1,0,1,0,0,1,1,0 UNION ALL
          SELECT 1,1,0,0,1,1,0,1,1,0,0,1,1,0,0 UNION ALL
          SELECT 0,1,1,0,0,1,0,1,0,0,0,0,1,1,1 UNION ALL
          SELECT 1,1,0,0,1,1,0,1,1,0,0,0,0,1,0 UNION ALL
          SELECT 1,1,1,0,0,1,0,1,0,0,0,1,1,0,0 UNION ALL
          SELECT 0,0,1,0,0,1,0,1,0,0,0,0,1,1,1 UNION ALL
          SELECT 1,1,1,0,0,1,0,1,1,0,1,1,0,1,0 UNION ALL
          SELECT 1,1,1,1,0,1,1,1,0,1,1,0,1,0,1 UNION ALL
          SELECT 0,0,1,1,1,1,0,1,0,1,0,1,1,1,0 UNION ALL
          SELECT 1,1,1,1,1,1,0,1,0,1,0,0,1,1,1
          Select * from 統計表


          統計表的商品名為n列,不只上面列出的那么多,如何實現n維數組輸出,即有多少個字段就輸出從一維直到n維的數組!
          具體目標:現有一參考值0.25,要輸出滿足條件的1到n維數組,其中一維數組統計單個商品名出現1的合計數,即每一個商品名出現一個1就算一次。

          二維數組統計為從第一列方便面開始起與相鄰的茶葉都為1,1的關系(依次組合查詢每相鄰兩個滿足條件的關系)。

          詳細:即從第一行找到最后一行,如發現循環組合滿足都為1,1這樣關系有5個,即sum記為5,依次再找從第一列方便面開始起與相隔一個位置的面包都為1,1的關系,如滿足這樣的關系從第一行到最后有3個即sum值記為3,依次類推再從第一列方便面開始與相隔兩位置的口香糖組合都為1,1的關系,這樣一直找到方便面與最后一列食醋(即第n列)的關系都為1,1的位置,再從開始的第二列循環與之后的每列依次組合查找1,1的關系,直到循環到從榨菜開始與最后一列食醋(第n列)為1,1的關系,二維數組循環完畢。

          輸出:如每以組合列滿足條件的sum值/所有行數>=0.25則輸出 該組合商品名稱,例如(茶葉,冰糖)組合關系為(1,1)的sum數/總行數>=0.25 則需將結果(茶葉,冰糖)輸出到 結果表 的values 字段,三維數組與n維數組算法與二維數組相似

          結果表輸出樣式:(中間以逗號分開)

          結果表
          values
          {方便面,口香糖,牛奶,食醋}
          {(茶葉,冰糖)(口香糖,玻璃杯)(榨菜,食醋)}
          {(方便面,茶葉,牛奶)(茶葉,口香糖,冰糖)(玻璃杯,食鹽,食醋) }
          {(n維數組1)(n維數組2)(n維數組3)(n維數組3)(...)(n維數組n)}


          請問上面的數據查詢如何實現!請貼出代碼!!

           

          IF OBJECT_ID('dbo.統計表') IS NOT NULL DROP TABLE 統計表
          CREATE TABLE 統計表 (方便面 INT,茶葉 INT,面包 INT,口香糖 INT,牛奶 INT,玻璃杯 INT,可樂 INT,冰糖 INT,牙膏 INT,牙刷 INT,故事書 INT,味素 INT,食鹽 INT,榨菜 INT,食醋 INT)
          INSERT INTO 統計表
          SELECT 1,0,0,0,0,1,0,0,0,1,0,0,1,0,0 UNION ALL
          SELECT 1,1,0,0,0,1,0,0,0,0,1,1,0,1,0 UNION ALL
          SELECT 0,1,1,1,0,1,1,1,0,1,0,0,1,1,0 UNION ALL
          SELECT 1,1,0,0,1,1,0,1,1,0,0,1,1,0,0 UNION ALL
          SELECT 0,1,1,0,0,1,0,1,0,0,0,0,1,1,1 UNION ALL
          SELECT 1,1,0,0,1,1,0,1,1,0,0,0,0,1,0 UNION ALL
          SELECT 1,1,1,0,0,1,0,1,0,0,0,1,1,0,0 UNION ALL
          SELECT 0,0,1,0,0,1,0,1,0,0,0,0,1,1,1 UNION ALL
          SELECT 1,1,1,0,0,1,0,1,1,0,1,1,0,1,0 UNION ALL
          SELECT 1,1,1,1,0,1,1,1,0,1,1,0,1,0,1 UNION ALL
          SELECT 0,0,1,1,1,1,0,1,0,1,0,1,1,1,0 UNION ALL
          SELECT 1,1,1,1,1,1,0,1,0,1,0,0,1,1,1
          Go
          Create   PROC xb_GetArray(@維數 INT, @系數 float ,@結果 VARCHAR(1000) out )
          AS
          SET NOCOUNT ON
          IF OBJECT_ID('dbo.Tmp') IS NOT NULL DROP TABLE dbo.Tmp
          CREATE TABLE Tmp(id INT,NAME VARCHAR(20))
          INSERT Tmp SELECT colid,NAME  FROM syscolumns s WHERE id=OBJECT_ID('統計表')
          IF OBJECT_ID('tempdb.dbo.#') IS NOT NULL DROP TABLE #
          CREATE TABLE #(ws INT,Result VARCHAR(1000))

          DECLARE @num INT
          DECLARE @f FLOAT
          DECLARE @sql nVARCHAR(1000)
          DECLARE @id VARCHAR(100),@w VARCHAR(100),@wh VARCHAR(100),@c VARCHAR(100)
          DECLARE @Step int ,@i INT ,@j INT ,@s INT,@l INT 

          SET @f=@系數
          SELECT  @num=count(1) FROM tmp 

          SET @i=1
          SET @Step=@維數
          set @結果=''
          WHILE @i<=@num
          BEGIN
             
          SET @wh=REPLICATE('1,',@Step)
             
          SET @j=@i
             
          WHILE @j<=@num-(@Step-1)
             
          BEGIN       
                 
          SELECT @l=1,@id='',@w='',@c=NULL   
                 
          WHILE @l<=@Step-1
                 
          BEGIN
                     
          SET @id=@id+LTRIM(@j+@l)+','
                     
          SET @l=@l+1
                 
          END
                 
          SELECT @id=ltrim(@i)+','+@id
                 
          SELECT @w=@w+'+ltrim('+NAME+')+'+''',''',@c=ISNULL(@c+',','')+Name FROM tmp WHERE CHARINDEX(','+LTRIM(id)+',',','+@id)>0 ORDER BY id        
                 
          SET @w=STUFF(@w,1,1,'')
                 
          SET @sql=N'if ((select count(*)*1.0 from 統計表 where '+@w+'='''+@wh+''')/'+LTRIM(@num)+'>' +LTRIM(@f) +') insert # select '+ltrim(@Step)+',''('+ @c+'),'''
                 
          EXEC(@sql)
                 
          SET @j=@j+1
             
          END
             
          SET @i=@i+1
          END
          SET @sql=NULL
          SELECT @sql=ISNULL(@sql+'','')+result FROM (SELECT DISTINCT result FROM # ) aa
          SET @結果='{'+@sql+'}'


          GO


          DECLARE @sql VARCHAR(1000)
          exec xb_GetArray 2,0.3,@sql OUT
          SELECT @sql 二維

          --result
          /*

          一維
          ---------------------------------------------------------------------------
          {(冰糖),(玻璃杯),(茶葉),(方便面),(面包),(食鹽),(味素),(牙刷),(榨菜),}

          (所影響的行數為 1 行)
          */

          DECLARE @sql VARCHAR(1000)
          exec xb_GetArray 2,0.3,@sql OUT
          SELECT @sql 二維
          /*二維                                                                                                                                                                                                      
          --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          {(冰糖,食鹽),(冰糖,榨菜),(玻璃杯,冰糖),(玻璃杯,食鹽),(玻璃杯,味素),(玻璃杯,牙刷),(玻璃杯,榨菜),(茶葉,冰糖),(茶葉,玻璃杯),(茶葉,面包),(茶葉,食鹽),(茶葉,榨菜),(方便面,冰糖),(方便面,玻璃杯),(方便面,茶葉),(方便面,食鹽),(面包,冰糖),(面包,玻璃杯),(面包,食鹽),(面包,榨菜),(食鹽,榨菜),(牙刷,食鹽),}

          (所影響的行數為 1 行)
          */

          posted on 2011-08-19 17:18 SkyDream 閱讀(280) 評論(0)  編輯  收藏 所屬分類: SQL語句

          <2011年8月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 抚松县| 武穴市| 西和县| 克拉玛依市| 大兴区| 高州市| 南丹县| 芜湖市| 兰西县| 涡阳县| 得荣县| 井陉县| 大同市| 涿鹿县| 外汇| 怀安县| 巍山| 黔南| 仁布县| 元阳县| 泗水县| 仙居县| 南皮县| 蒙自县| 安多县| 余江县| 苗栗县| 威信县| 龙门县| 四平市| 普定县| 濉溪县| 芷江| 泰兴市| 兰州市| 南和县| 林甸县| 耿马| 吉木萨尔县| 无为县| 连城县|