很抱歉,如果我以错误的方式提问,我是SQL的新手。
我有一个临时表,我在连接不同的表后插入值
然后,我遇到了需要用3个字段更新临时表的地方(colm1作为datetime,colm2 datetime,colm3 money) 为此我在临时表中创建了字段。
现在,
select colm1,colm2,sum(colm3)
from OrginalTable
where userid=@userid
group by colm1,colm2
让我们假设这给出了如下结果:
这里在更新到Temp表之后,如果有多个数据,那么我需要做到如下,直到15次:
Colm1,Com2,Colm3,colm1,colm2,colm3,
而不是创建新行我需要将其显示为1行的新字段
执行结果应该全部在一行。
我真的很困惑,我是否可以做到预期与否,如果有办法,请有人给我示例或解决这个问题。
最后,感谢您的帮助
答案 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
<强>设定:强>
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结果