Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
sg2255551
Constraint Violating Yak Guru
274 Posts |
Posted - 2010-08-25 : 23:22:01
|
| hiHow do i permutate fields? for exampleSelect A, B, C, D from tableAI want to have every possible combination for the 4 fields. The result would be in a varchar max A B C D D C B A A D B C A C B D and so on.Thanks a lot. |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2010-08-25 : 23:35:52
|
you mean the result will be a single column that concatenate the value of 4 columns (A, B, C, D) together ?Example ? KH[spoiler]Time is always against us[/spoiler] |
 |
|
|
sg2255551
Constraint Violating Yak Guru
274 Posts |
Posted - 2010-08-25 : 23:46:10
|
| Yes it is. thanks |
 |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2010-08-26 : 00:11:00
|
Any Example like sample data and expected result ?Is the column name fixed or dynamic ?Is the number of columns fixed or variable ? KH[spoiler]Time is always against us[/spoiler] |
 |
|
|
sg2255551
Constraint Violating Yak Guru
274 Posts |
Posted - 2010-08-26 : 00:42:27
|
| The name of the column name is fixed and the number of columns is also fixed.I do know how i should give you the expected result. But let try this.In column A i have a value 'Hello World'In column B i have a value 'How are you'In column C i have a value 'What is there'In column D i have a value 'I am fine'The expected result would be a permutation of columns A B C D. So you would have Hello World How are you What is there I am fine How are you What is there Hello World I am fine and so on.As you could see there is no permutation of words but permutation at columns level. Thanks |
 |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2010-08-26 : 00:44:03
|
quote: The name of the column name is fixed and the number of columns is also fixed.
if this is fixed, then you can simplyselect A + B + C + D + D + C + B + A + A + D + B + C + A + C + B + D and so on . . from yourtable KH[spoiler]Time is always against us[/spoiler] |
 |
|
|
sg2255551
Constraint Violating Yak Guru
274 Posts |
Posted - 2010-08-26 : 00:50:44
|
| yes you are right. at the moment the number of columns is fixed, but i am also worry that a new column might be needed in the future. so is there a dynamic script that allows me to add a new column if needed. thanks |
 |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2010-08-26 : 02:33:16
|
quote: so is there a dynamic script that allows me to add a new column if needed.
This will not be easy . . . . but will be fun to come up with one KH[spoiler]Time is always against us[/spoiler] |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2010-08-26 : 03:51:41
|
quote: Originally posted by khtan but will be fun to come up with one
True.-- User supplied parametersDECLARE @TableSchema SYSNAME = 'Core', @TableName SYSNAME = 'dimApplication'-- Holding variablesDECLARE @Select NVARCHAR(MAX), @From NVARCHAR(MAX)-- Get the query partsSELECT @Select = ( SELECT CASE ORDINAL_POSITION WHEN 1 THEN 'SELECT ' ELSE ' ' END + 't' + CAST(ORDINAL_POSITION AS VARCHAR(12)) + '.' + QUOTENAME(COLUMN_NAME) + CASE MAX(ORDINAL_POSITION) OVER () WHEN ORDINAL_POSITION THEN '' ELSE ',' END + CHAR(10) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @TableSchema AND TABLE_NAME = @TableName ORDER BY ORDINAL_POSITION FOR XML PATH('') ), @From = ( SELECT CASE ORDINAL_POSITION WHEN 1 THEN 'FROM ' ELSE 'CROSS JOIN ' END + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + ' AS t' + CAST(ORDINAL_POSITION AS VARCHAR(12)) + CHAR(10) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @TableSchema AND TABLE_NAME = @TableName ORDER BY ORDINAL_POSITION FOR XML PATH('') )-- Execute the statementEXEC (@Select + @From) N 56°04'39.26"E 12°55'05.63" |
 |
|
|
sg2255551
Constraint Violating Yak Guru
274 Posts |
Posted - 2010-08-26 : 04:48:40
|
| I could not get this to work. It complains about Msg 102, Level 15, State 1, Line 1Incorrect syntax near ','.DECLARE @Select as NVARCHAR(MAX),@From as NVARCHAR(MAX)SELECT @Select =(SELECT CASE ORDINAL_POSITION WHEN 1 THEN 'SELECT ' ELSE '' END + 't' + CAST(ORDINAL_POSITION AS VARCHAR(12)) + '.' + QUOTENAME(COLUMN_NAME) + CASE MAX(ORDINAL_POSITION) OVER () WHEN ORDINAL_POSITION THEN '' ELSE ',' END + CHAR(10) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'TableA' and ORDINAL_POSITION in(2,4,5,10,11,17) ORDER BY ORDINAL_POSITION FOR XML PATH('') ), @From = (SELECT CASE ORDINAL_POSITION WHEN 1 THEN 'FROM ' ELSE 'CROSS JOIN ' END + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + ' AS t' + CAST(ORDINAL_POSITION AS VARCHAR(12)) + CHAR(10) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'TableA' and ORDINAL_POSITION in(2,4,5,10,11,17) ORDER BY ORDINAL_POSITION FOR XML PATH('') )-- Execute the statementEXEC (@Select + @From) |
 |
|
|
sg2255551
Constraint Violating Yak Guru
274 Posts |
Posted - 2010-08-26 : 04:51:06
|
| I also found this script on the internet but i tried to replace with actual columns name from a table for the @base variable but could not get it to work.Alter Proc sp_permutate (@n smallint)asbegin set nocount on declare @sqlStmt varchar(4000) declare @base varchar(300) declare @list varchar(300) declare @i int declare @j int set @base = '(' + 'SELECT 0 AS X, ' + '''' + 'A' + '''' + ' as Y ' + ' UNION ALL ' + 'SELECT 1 , ' + '''' + 'B' + '''' + ' UNION ALL ' + 'SELECT 2 , ' + '''' + 'C' + '''' + ' UNION ALL ' + 'SELECT 3 , ' + '''' + 'D' + '''' + ' UNION ALL ' + 'SELECT 4 , ' + '''' + 'E' + '''' + ' UNION ALL ' + 'SELECT 5 , ' + '''' + 'F' + '''' + ' UNION ALL ' + 'SELECT 6 , ' + '''' + 'G' + '''' + ' UNION ALL ' + 'SELECT 7 , ' + '''' + 'H' + '''' + ' UNION ALL ' + 'SELECT 8 , ' + '''' + 'I' + '''' + ' UNION ALL ' + 'SELECT 9 , ' + '''' + 'J' + '''' + ' ) ' -- DO the select list set @i=1 set @list = 'SELECT ' while @i <= @n begin SET @list = @list + 'T' + convert (varchar(2),@i) + '.Y,' SET @i = @i + 1 end set @list = substring (@list,1,len (@list)-1) set @list = @list + ' FROM ' -- DO the FROM list set @sqlStmt = @list set @i=1 while @i <= @n begin SET @sqlStmt = @sqlStmt + @base +' as T' + convert (varchar(2),@i) +' ,' SET @i = @i + 1 end set @sqlStmt = substring (@sqlStmt,1,len (@sqlStmt)-1) -- DO first where clauses set @sqlStmt = @sqlStmt + ' WHERE ' set @i=1 while @i <= @n begin SET @sqlStmt = @sqlStmt + 'T' + convert (varchar(2),@i) + '.X < ' + convert (varchar(2),@n) + ' AND ' SET @i = @i + 1 end -- continue the WHERE clauses set @i=1 while @i < @n begin set @j = @i + 1 while @j <= @n begin SET @sqlStmt = @sqlStmt + 'T' + convert (varchar(2),@i) + '.X <> ' + 'T' + convert (varchar(2),@j) + '.X AND ' SET @j = @j + 1 end SET @i = @i + 1 end set @sqlStmt = substring (@sqlStmt,1,len (@sqlStmt)-4) print @sqlStmt exec (@sqlStmt) set nocount offendgo |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2010-08-26 : 05:01:34
|
Of course it doesn't work when you remove some of the ordinals in the query!If you read the query, you can see that the code is dependant on ordinal_position 1 is present.Removing some ordinals was not public knowledge in your first post, was it? N 56°04'39.26"E 12°55'05.63" |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2010-08-26 : 05:04:25
|
Here is the code that works with ordinals removed.Is there something else we need to know, that you this far haven't told us?-- User supplied parametersDECLARE @TableSchema SYSNAME = 'Core', @TableName SYSNAME = 'dimApplication'-- Holding variablesDECLARE @Select NVARCHAR(MAX), @From NVARCHAR(MAX)-- Get the query partsSELECT @Select = ( SELECT CASE MIN(ORDINAL_POSITION) OVER () WHEN ORDINAL_POSITION THEN 'SELECT DISTINCT ' ELSE ' ' END + 't' + CAST(ORDINAL_POSITION AS VARCHAR(12)) + '.' + QUOTENAME(COLUMN_NAME) + CASE MAX(ORDINAL_POSITION) OVER () WHEN ORDINAL_POSITION THEN '' ELSE ',' END + CHAR(10) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @TableSchema AND TABLE_NAME = @TableName AND ORDINAL_POSITION IN (2, 4) ORDER BY ORDINAL_POSITION FOR XML PATH('') ), @From = ( SELECT CASE MIN(ORDINAL_POSITION) OVER () WHEN ORDINAL_POSITION THEN 'FROM ' ELSE 'CROSS JOIN ' END + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + ' AS t' + CAST(ORDINAL_POSITION AS VARCHAR(12)) + CHAR(10) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @TableSchema AND TABLE_NAME = @TableName AND ORDINAL_POSITION IN (2, 4) ORDER BY ORDINAL_POSITION FOR XML PATH('') )-- Execute the statementEXEC (@Select + @From) N 56°04'39.26"E 12°55'05.63" |
 |
|
|
sg2255551
Constraint Violating Yak Guru
274 Posts |
Posted - 2010-08-26 : 05:12:23
|
| Thanks for pointing it out. Ok i have managed to get it going, but the results is more of like cross join which i do not want. Rather it should be the result of a combination of columns and not at row level. I found this script which the result is what i expected but when i tried to replace it with actual columns name from a table for a variable called @Base, it failed. How should i replace it with actual columns. ThanksAlter Proc sp_permutate (@n smallint)asbegin set nocount on declare @sqlStmt varchar(4000) declare @base varchar(300) declare @list varchar(300) declare @i int declare @j int set @base = '(' + 'SELECT 0 AS X, ' + '''' + 'A' + '''' + ' as Y ' + ' UNION ALL ' + 'SELECT 1 , ' + '''' + 'B' + '''' + ' UNION ALL ' + 'SELECT 2 , ' + '''' + 'C' + '''' + ' UNION ALL ' + 'SELECT 3 , ' + '''' + 'D' + '''' + ' UNION ALL ' + 'SELECT 4 , ' + '''' + 'E' + '''' + ' UNION ALL ' + 'SELECT 5 , ' + '''' + 'F' + '''' + ' UNION ALL ' + 'SELECT 6 , ' + '''' + 'G' + '''' + ' UNION ALL ' + 'SELECT 7 , ' + '''' + 'H' + '''' + ' UNION ALL ' + 'SELECT 8 , ' + '''' + 'I' + '''' + ' UNION ALL ' + 'SELECT 9 , ' + '''' + 'J' + '''' + ' ) ' -- DO the select list set @i=1 set @list = 'SELECT ' while @i <= @n begin SET @list = @list + 'T' + convert (varchar(2),@i) + '.Y,' SET @i = @i + 1 end set @list = substring (@list,1,len (@list)-1) set @list = @list + ' FROM ' -- DO the FROM list set @sqlStmt = @list set @i=1 while @i <= @n begin SET @sqlStmt = @sqlStmt + @base +' as T' + convert (varchar(2),@i) +' ,' SET @i = @i + 1 end set @sqlStmt = substring (@sqlStmt,1,len (@sqlStmt)-1) -- DO first where clauses set @sqlStmt = @sqlStmt + ' WHERE ' set @i=1 while @i <= @n begin SET @sqlStmt = @sqlStmt + 'T' + convert (varchar(2),@i) + '.X < ' + convert (varchar(2),@n) + ' AND ' SET @i = @i + 1 end -- continue the WHERE clauses set @i=1 while @i < @n begin set @j = @i + 1 while @j <= @n begin SET @sqlStmt = @sqlStmt + 'T' + convert (varchar(2),@i) + '.X <> ' + 'T' + convert (varchar(2),@j) + '.X AND ' SET @j = @j + 1 end SET @i = @i + 1 end set @sqlStmt = substring (@sqlStmt,1,len (@sqlStmt)-4) print @sqlStmt exec (@sqlStmt) set nocount offendgo |
 |
|
|
sg2255551
Constraint Violating Yak Guru
274 Posts |
Posted - 2010-08-26 : 05:22:38
|
quote: Originally posted by Peso Of course it doesn't work when you remove some of the ordinals in the query!If you read the query, you can see that the code is dependant on ordinal_position 1 is present.Removing some ordinals was not public knowledge in your first post, was it? N 56°04'39.26"E 12°55'05.63"
Sorry. As i do not know what solution is going to be like, i therefore adapted it accordingly. thanks |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2010-08-26 : 05:41:42
|
[code]-- User supplied parametersDECLARE @TableSchema SYSNAME = 'Core', @TableName SYSNAME = 'dimApplication'-- Holding variablesDECLARE @Select NVARCHAR(MAX), @From NVARCHAR(MAX), @Values NVARCHAR(MAX)-- Get the query partsSET @Values = ( SELECT CASE ORDINAL_POSITION WHEN MIN(ORDINAL_POSITION) OVER () THEN '(SELECT ' + QUOTENAME(COLUMN_NAME, '''') + ' AS ColName' WHEN MAX(ORDINAL_POSITION) OVER () THEN ' UNION ALL SELECT ' + QUOTENAME(COLUMN_NAME, '''') + ')' ELSE ' UNION ALL SELECT ' + QUOTENAME(COLUMN_NAME, '''') END FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @TableSchema AND TABLE_NAME = @TableName AND ORDINAL_POSITION IN (2, 4) FOR XML PATH('') );WITH cteColumns(ColNum)AS ( SELECT CAST(ROW_NUMBER() OVER (ORDER BY ORDINAL_POSITION) AS VARCHAR(12)) AS ColNum FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @TableSchema AND TABLE_NAME = @TableName AND ORDINAL_POSITION IN (2, 4))SELECT @Select = ( SELECT CASE ColNum WHEN MIN(ColNum) OVER () THEN 'SELECT t' + ColNum + '.ColName AS Col' + ColNum + ',' WHEN MAX(ColNum) OVER () THEN ' t' + ColNum + '.ColName AS Col' + ColNum ELSE ' t' + ColNum + '.ColName AS Col' + ColNum + ',' END + CHAR(10) FROM cteColumns FOR XML PATH('') ), @From = ( SELECT CASE ColNum WHEN MIN(ColNum) OVER () THEN 'FROM ' ELSE 'CROSS JOIN ' END + @Values + ' AS t' + ColNum + CHAR(10) FROM cteColumns FOR XML PATH('') )-- Execute the statementEXEC (@Select + @From)[/code] N 56°04'39.26"E 12°55'05.63" |
 |
|
|
sg2255551
Constraint Violating Yak Guru
274 Posts |
Posted - 2010-08-26 : 06:23:48
|
| hiStill the result is not right. Based on 4 ordinal position it should return a possible combination of 24 rows. However, i did not manage to get the result set.I have some data sample here and have included in the where statement for ordinal position of the Yaks table. thanksCREATE TABLE Yaks (YakID int,YakType nvarchar(30),YakGender nvarchar(30),YakPostion nvarchar(30),YakRegion nvarchar(30) )Insert into Yaks Values(1,'Hire','Man','Manager','North')Insert into Yaks Values(2,'Lease','Man','Supervisor','North')Insert into Yaks Values(3,'Hire','Lady','Director','South')Insert into Yaks Values(4,'Lease','Lady','Officer','West')Insert into Yaks Values(5,'Hire','Man','Officer','East')DECLARE @Select NVARCHAR(MAX), @From NVARCHAR(MAX), @Values NVARCHAR(MAX)-- Get the query partsSET @Values = ( SELECT CASE ORDINAL_POSITION WHEN MIN(ORDINAL_POSITION) OVER () THEN '(SELECT ' + QUOTENAME(COLUMN_NAME, '''') + ' AS ColName' WHEN MAX(ORDINAL_POSITION) OVER () THEN ' UNION ALL SELECT ' + QUOTENAME(COLUMN_NAME, '''') + ')' ELSE ' UNION ALL SELECT ' + QUOTENAME(COLUMN_NAME, '''') END FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'Yaks' and ORDINAL_POSITION in(2,3,4,5) FOR XML PATH('') )--Select @Values;WITH cteColumns(ColNum)AS ( SELECT CAST(ROW_NUMBER() OVER (ORDER BY ORDINAL_POSITION) AS VARCHAR(12)) AS ColNum FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'Yaks' and ORDINAL_POSITION in(2,3,4,5))SELECT @Select = ( SELECT CASE ColNum WHEN MIN(ColNum) OVER () THEN 'SELECT t' + ColNum + '.ColName AS Col' + ColNum + ',' WHEN MAX(ColNum) OVER () THEN ' t' + ColNum + '.ColName AS Col' + ColNum ELSE ' t' + ColNum + '.ColName AS Col' + ColNum + ',' END + CHAR(10) FROM cteColumns FOR XML PATH('') ), @From = ( SELECT CASE ColNum WHEN MIN(ColNum) OVER () THEN 'FROM ' ELSE 'CROSS JOIN ' END + @Values + ' AS t' + ColNum + CHAR(10) FROM cteColumns FOR XML PATH('') )-- Execute the statementEXEC (@Select + @From) |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2010-08-26 : 06:30:14
|
[code]CREATE TABLE Yaks ( YakID int, YakType nvarchar(30), YakGender nvarchar(30), YakPostion nvarchar(30), YakRegion nvarchar(30) )Insert YaksValues (1,'Hire','Man','Manager','North'), (2,'Lease','Man','Supervisor','North'), (3,'Hire','Lady','Director','South'), (4,'Lease','Lady','Officer','West'), (5,'Hire','Man','Officer','East')DECLARE @Select NVARCHAR(MAX), @From NVARCHAR(MAX), @Values NVARCHAR(MAX), @Where NVARCHAR(MAX)-- Get the query partsSET @Values = ( SELECT CASE ORDINAL_POSITION WHEN MIN(ORDINAL_POSITION) OVER () THEN '(SELECT ' + QUOTENAME(COLUMN_NAME, '''') + ' AS ColName' WHEN MAX(ORDINAL_POSITION) OVER () THEN ' UNION ALL SELECT ' + QUOTENAME(COLUMN_NAME, '''') + ')' ELSE ' UNION ALL SELECT ' + QUOTENAME(COLUMN_NAME, '''') END FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'Yaks' AND ORDINAL_POSITION IN (2, 3, 4, 5) FOR XML PATH('') );WITH cteColumns(ColNum)AS ( SELECT CAST(ROW_NUMBER() OVER (ORDER BY ORDINAL_POSITION) AS VARCHAR(12)) AS ColNum FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'Yaks' AND ORDINAL_POSITION IN (2, 3, 4, 5))SELECT @Select = ( SELECT CASE ColNum WHEN MIN(ColNum) OVER () THEN 'SELECT t' + ColNum + '.ColName AS Col' + ColNum + ',' WHEN MAX(ColNum) OVER () THEN ' t' + ColNum + '.ColName AS Col' + ColNum ELSE ' t' + ColNum + '.ColName AS Col' + ColNum + ',' END + CHAR(10) FROM cteColumns FOR XML PATH('') ), @From = ( SELECT CASE ColNum WHEN MIN(ColNum) OVER () THEN 'FROM ' ELSE 'CROSS JOIN ' END + @Values + ' AS t' + ColNum + CHAR(10) FROM cteColumns FOR XML PATH('') ), @Where = ( SELECT CASE c.ColNum WHEN MIN(c.ColNum) OVER () THEN 'WHERE t' + c.ColNum + '.ColName NOT IN (' ELSE ' AND t' + c.ColNum + '.ColName NOT IN (' END + STUFF((SELECT ', t' + x.ColNum + '.ColName' FROM cteColumns AS x WHERE x.ColNum > c.ColNum FOR XML PATH('')), 1, 2, '') + ')' + CHAR(10) FROM cteColumns AS c FOR XML PATH('') )-- Execute the statementEXEC (@Select + @From + @Where)DROP TABLE Yaks[/code] N 56°04'39.26"E 12°55'05.63" |
 |
|
|
sg2255551
Constraint Violating Yak Guru
274 Posts |
Posted - 2010-08-26 : 06:54:41
|
| Sorry, actually there is another column in the Yaks table call Longvalue which stores the possible combine values from 4 columnsfor row 1 the possible combination for Hire Man Manager North but the display of result is stored in Longvalue such as Hire Man Manager North Man Hire Manager North Manager Hire Man North and so onfor row 2 the possible combination for Lease Lady Supervisor Northbut the display of result is stored in Longvalue such as Lease Lady Supervisor North Lady Lease Supervisor North Supervisor North Lease Lady and so onThanks |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2010-08-26 : 07:22:47
|
First thing. Do you get the wanted result with my code posted 08/26/2010 : 06:30:14 ? N 56°04'39.26"E 12°55'05.63" |
 |
|
|
sg2255551
Constraint Violating Yak Guru
274 Posts |
Posted - 2010-08-26 : 07:33:26
|
| yes i have tried but instead i get columns name displayed as a result not the actual value. ThanksThis is the resultYakGender YakRegion YakPostion YakTypeYakGender YakPostion YakRegion YakTypeYakPostion YakRegion YakGender YakTypeYakPostion YakGender YakRegion YakTypeYakRegion YakPostion YakGender YakTypeYakRegion YakGender YakPostion YakTypeYakType YakRegion YakPostion YakGenderYakType YakPostion YakRegion YakGenderYakPostion YakRegion YakType YakGenderYakPostion YakType YakRegion YakGenderYakRegion YakPostion YakType YakGenderYakRegion YakType YakPostion YakGenderYakType YakRegion YakGender YakPostionYakType YakGender YakRegion YakPostionYakGender YakRegion YakType YakPostionYakGender YakType YakRegion YakPostionYakRegion YakGender YakType YakPostionYakRegion YakType YakGender YakPostionYakType YakPostion YakGender YakRegionYakType YakGender YakPostion YakRegionYakGender YakPostion YakType YakRegionYakGender YakType YakPostion YakRegionYakPostion YakGender YakType YakRegionYakPostion YakType YakGender YakRegion |
 |
|
|
Next Page
|
|
|
|
|