在不知道SQL中的列的情况下创建表

时间:2017-01-18 13:26:14

标签: sql sql-server pivot case

如何在不事先知道确切包含多少列和哪些列的情况下创建表?

我的想法是我有一个包含3列的表DATA:IDNAMEVALUE

我需要的是根据NAME的值获取多个值的方法 - 我无法使用简单WHEREJOIN(因为我&#39} ; ll需要其他值 - 使用其他NAME值 - 稍后在我的查询中。)

由于构建此表的方式,我希望PIVOTNAME的每个不同值转换为列,以便在以后的搜索中更容易找到它。

我现在想要的是以某种方式将其保存到临时表/变量中,以便稍后我可以使用它来加入另一个查询的结果......

所以例子:

列:

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';

1 个答案:

答案 0 :(得分:0)

好吧,据我所知 - 你有一些select语句,只需要将其结果“转储”到一些临时表中。在这种情况下,您可以使用select into语法,如:

select .....
into #temp_table
from ....

这将根据select语句中的列创建临时表,并使用select datatement返回的数据填充它。

请参阅MDSN以供参考。