如果事先不知道表到底包含多少列和哪些列,如何创建表?
想法是我有一个表DATA,它有3列:ID
、NAME
和VALUE
我需要的是一种根据NAME
的值获得多个值的方法——我不能用简单的WHERE
或JOIN
来实现这一点(因为我稍后在查询中需要其他值——用其他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。。。成为哥伦布。我这样做是动态的,因为可能的列太多了——我需要一段时间才能将所有列都写在"in"语句中——而且我不想每次添加新的"name"值时都记得手动添加。。。所以我跟着http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/
问题是,我希望execute(@query)的结果存储在tempTab/变量中。我想稍后使用它将其与mainTab连接。。。如果我能使用@cols(保存DATA.name的值)那就太好了,但我似乎想不出一种方法来做到这一点。
此外:如果我使用非动态方式(在"IN"之后手动写下所有值),我仍然需要创建一个名为status的列。现在,在这一列中(到目前为止,到处都是NULL,因为该值不存在于我的未分页表中),我希望有"open"或"closed",这取决于日期(假设我有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';
好吧,据我所知,您有一些select语句,只需要将其结果"转储"到某个临时表中。在这种情况下,您可以使用select into
语法,如:
select .....
into #temp_table
from ....
这将根据select语句中的列创建临时表,并用select datatement返回的数据填充它。
请参阅MDSN以获取参考。