我有一个表,其中有两列是从另一个名称表构建的,一个标识和一个名称是这样的:
ID---Name
1----Mike
2----Jeff
3----Robert
...down to however many
可以是10行,可以是100.这将取决于其他表中的输入,这些表总是在变化但从不超过160左右。
现在,名称的配对将具有一些含义,因此十进制数据类型得分将与所述配对相关联(此时如何无关紧要,现在只需要构建它......数字只是说明性的)。我设想像这样的矩阵:
ID------Name------Mike-------Jeff--------Robert-------- ...out to however many
1 -------Mike-------NULL------100.1------5.4-------- ...out to however many
2 -------Jeff---------100.1------NULL-----21.23--------- ...out to however many
3 ------Robert-------5.4--------21.23-----NULL---------...out to however many
......但是很多人碰巧在第一张桌子上......
也许这不是最优选的方法(是的,我知道表中有重复但我计划构建查询以便忽略重复项)但是此时我并不知道有很多可行的选项。在搜索之后,我想也许我想要一个支点,但这似乎不适合我在这里,因为我将列中的名称留下并将它们关联为列头以获得配对分数。然后我想也许我想将变量存储为每行的值,然后将它们添加为列。那没有用。我最近的迭代可能是创建一个临时表作为与身份列的精确副本,然后尝试通过身份选择特定的名称并循环通过它们但我甚至似乎无法获取名字并使其成为列名除了名称列下的行值...请参阅下面的
--create a table of names with an identity column
CREATE TABLE myTable2
(
ID INT IDENTITY(1,1),
Name VARCHAR(5),
);
--add names to the table from a different table
INSERT INTO myTable1 (Name)
SELECT Name
FROM myTable1
--create a temp table with the same values
SELECT ID, Name
INTO #new
FROM myTable2
GROUP BY ID, Name
--insert name from first row as a column head
INSERT INTO myTable2 (SELECT Number FROM #new WHERE ID =1)
所以,在最后一点,INSERT INTO“,我想复制名称,在这个例子中”Mike“,并使它成为同一个表中的一个列头,它是一行(就像在我的第二个表中) )。我收到一条错误消息,声明语法不正确。为什么不允许这样做?我怎样才能让它做我想做的事情?有人建议我比这更了解这些东西,也许不是将表格作为矩阵构建,而是按照下面的方式构建。这里有可能以这种方式摆脱重复,除了我不知道从哪里开始这样做...
Name1-----------Name2-----------Calculated Value
Mike--------------Mike-------------NULL
Jeff---------------Mike-------------100.1
Robert-------------Mike-------------5.4
Mike--------------Jeff-------------100.1
Jeff----------------Jeff-------------NULL
Robert------------Jeff-------------21.23
Mike--------------Robert-----------5.4
Jeff---------------Robert-----------21.23
Robert------------Robert-----------NULL
...etc
任何帮助建议或指出我在正确和最合适的方向将不胜感激!
编辑:这就是我解决问题的方法。看起来像笛卡尔产品是要走的路。谢谢@Alex Kudryashev--create a table of cross joined names
CREATE TABLE cartNames
(
Name1 VARCHAR(5),
Name2 VARCHAR(5),
);
--create two temporary tables from a source table of names
SELECT Name AS Name1
INTO #name1
FROM names
GROUP BY Name
SELECT Name AS Name2
INTO #Name2
FROM names
GROUP BY Name
--populate the Cartesian table
INSERT INTO cartNames
SELECT * FROM #name1 CROSS JOIN #name2
--get rid of the temp tables
DROP TABLE #Name1
DROP TABLE #Name2
--add columns and populate calculated scores
---
答案 0 :(得分:1)
您似乎想要创建笛卡儿产品。有很简单的方法可以做到。
declare @tbl table(name varchar(10))
insert @tbl(name) values('MIke'),('Jeff'),('Robert')
select t1.name name1,t2.name name2, some_udf(t1.name,t2.name) calc_value
from @tbl t1 cross join @tbl t2