【问题标题】:TSQL: Need to have new column instead of next rowTSQL:需要有新列而不是下一行
【发布时间】:2016-08-31 21:27:07
【问题描述】:

对不起,如果我问错了,我是 SQL 新手。

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

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

现在,

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

假设这会给出如下结果:

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

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

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

执行结果应该在 1 行中。

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

最后,感谢您的帮助

【问题讨论】:

  • 对不起,这太混乱了,你能展示一下你想要的结果吗? if multiple data then i need to do like below till 15 times
  • 如果你想要新的列,我相信你必须选择它们。
  • @Lamak 我已经更新了我的问题,期待,谢谢
  • 你的问题解决了吗?

标签: sql-server tsql


【解决方案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

输出:反透视和动态透视结果

【讨论】:

    【解决方案2】:

    这听起来像是你应该在你的 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 上这样做

    【讨论】:

    • 不,这是通过 SQL 单独完成的。希望我可以通过 UI 完成,但如果是这样,我必须再次制作 UI
    猜你喜欢
    • 2023-01-20
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多