精華答題收藏之邏輯難題(字符拆分)
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語句