如何在不事先知道确切包含多少列和哪些列的情况下创建表?
我的想法是我有一个包含3列的表DATA:ID
,NAME
和VALUE
我需要的是根据NAME
的值获取多个值的方法 - 我无法使用简单WHERE
或JOIN
(因为我&#39} ; ll需要其他值 - 使用其他NAME
值 - 稍后在我的查询中。)
由于构建此表的方式,我希望PIVOT
将NAME
的每个不同值转换为列,以便在以后的搜索中更容易找到它。
我现在想要的是以某种方式将其保存到临时表/变量中,以便稍后我可以使用它来加入另一个查询的结果......
所以例子:
列:
CREATE TABLE MainTab
(
id int,
nameMain varchar(max),
notes varchar(max)
);
CREATE TABLE SecondTab
(
id int,
id_mainTab, int,
nameSecond varchar(max),
notes varchar(max)
);
CREATE TABLE DATA
(
id int,
id_second int,
name varchar(max),
value varchar(max)
);
现在表DATA中的一些示例数据:
| id | id_second_int | name | value |
|-------------------------------------------------------|
| 1 | 5550 | number | 111115550 |
| 2 | 6154 | address | 1, First Avenue |
| 3 | 1784 | supervisor | John Smith |
| 4 | 3467 | function | Marketing |
| 5 | 9999 | start_date | 01/01/2000 |
::::
现在想象一下' name'有很多不同的值,在一个查询中,我需要根据' name'的值来获得许多不同的值... 这就是为什么我将它转动为数字,地址,主管,函数,start_date ......成为colums的原因。 我这是动态的,因为可能的列数量 - 我需要一段时间才能在“' IN'声明 - 我不想记得每次新的名字时都要手动添加它。价值被添加...... 因此我跟着http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/
事情是知道我希望我的执行结果(@query)存储在tempTab /变量中。我想稍后用它来加入mainTab ... 如果我可以使用@cols(它包含DATA.name的值)会很好,但我似乎无法找到一种方法来做到这一点。
此外: 如果我使用非动态方式(在' IN'之后手动记下所有值),我仍然需要创建一个名为status的列。现在在这个专栏中(到目前为止,它到处都是NULL,因为该值不存在于我的不透明表中)我希望打开'或者'关闭',取决于日期(让我们说我有start_date和end_date,
CASE end_date
WHEN end_date < GETDATE() THEN pivotTab.status = 'closed'
ELSE pivotTab.status = 'open'
我可以在哪里发表此声明?让我们说我的主要查询如下:
SELECT * FROM(
(SELECT id_second, name, value, id FROM TABLE_DATA) src
PIVOT (max(value) FOR name IN id, number, address, supervisor, function, start_date, end_date, status) AS pivotTab
JOIN SecondTab ON SecondTab.id = pivotTab.id_second
JOIN MainTab ON MainTab.id = SecondTab.id_mainTab
WHERE pivotTab.status = 'closed';
答案 0 :(得分:0)
好吧,据我所知 - 你有一些select语句,只需要将其结果“转储”到一些临时表中。在这种情况下,您可以使用select into
语法,如:
select .....
into #temp_table
from ....
这将根据select语句中的列创建临时表,并使用select datatement返回的数据填充它。
请参阅MDSN以供参考。