TSQL:需要有新列而不是下一行

时间:2016-08-30 15:06:37

标签: sql-server tsql

很抱歉,如果我以错误的方式提问,我是SQL的新手。

我有一个临时表,我在连接不同的表后插入值

然后,我遇到了需要用3个字段更新临时表的地方(colm1作为datetime,colm2 datetime,colm3 money) 为此我在临时表中创建了字段。

现在,

  select colm1,colm2,sum(colm3)
  from OrginalTable
  where userid=@userid
  group by colm1,colm2

让我们假设这给出了如下结果:

enter image description here

这里在更新到Temp表之后,如果有多个数据,那么我需要做到如下,直到15次:

Colm1,Com2,Colm3,colm1,colm2,colm3,

而不是创建新行我需要将其显示为1行的新字段

enter image description here

执行结果应该全部在一行。

我真的很困惑,我是否可以做到预期与否,如果有办法,请有人给我示例或解决这个问题。

最后,感谢您的帮助

2 个答案:

答案 0 :(得分:1)

这听起来像你应该在你的UI层上做的事情而不是db。

否则你需要像

这样的东西
 SELECT t1.*, t2.*, ....... , t15.*
 FROM yourTable as t1, 
      yourTable as t2, 
      ...... 
      yourTable as t15
 WHERE t1.col1 >= t2.col1 and t1.col2 > t2.col2
   AND t2.col1 >= t3.col1 and t2.col2 > t3.col2
   ....
   AND t14.col1 >= t14.col15 and t14.col2 > t15.col2

问题是你需要知道有15行,所以如果这个数字改变了你的查询就行了。

这就是你应该在UI上做的原因

答案 1 :(得分:1)

您可以使用UNPIVOT,然后使用Dynamic PIVOT

DEMO

<强>设定:

create table temp (
    col1 integer, col2 integer, col3 integer
)

insert into temp values (1, 1, 1000);
insert into temp values (1, 2, 500);
insert into temp values (2, 3, 800);
insert into temp values (2, 4, 700);
insert into temp values (3, 1, 1100);

UNPIVOT查询:您需要row_number来创建虚假列名称。但然后为每个人覆盖行1,因此所有列都显示在一行

WITH cte as (
    SELECT row_number() over (order by col1, col2) as rn,
           col1, col2, col3
    FROM temp
)
SELECT 1 as rn, 
       'c_' + 
       CAST(rn AS VARCHAR(16)) + '_' + 
       myCol as myCol, 
       myVal
INTO temp2            
FROM 
   (SELECT rn, col1, col2, col3
    FROM cte) p
UNPIVOT
   (myVal FOR myCol IN 
      (col1, col2, col3)
)AS unpvt;

SELECT * FROM temp2;

动态数据透视

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.myCol) 
            FROM temp2 c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT rn, ' + @cols + ' from 
            (
                select rn
                    , myCol
                    , myVal
                from temp2
           ) x
            pivot 
            (
                max(myVal)
                for myCol in (' + @cols + ')
            ) p ';                    

EXEC sp_executesql @query

输出:Unpivot和Dynamic Pivot结果

enter image description here