如何编写从源数据表计算结果集列的SQL查询
我有一个数据表(#t#timevalue),类似于下一个示例:如何编写从源数据表计算结果集列的SQL查询,sql,sql-server,Sql,Sql Server,我有一个数据表(#t#timevalue),类似于下一个示例: Time Value ------------- t1 v1 t1 v2 t1 v3 t2 v1 t2 v3 t3 v1 t4 v2 t4 v3 我正在尝试创建一个查询,将数据汇总如下: Time v1 v2 v3 t1 1 1 1 t2 1 0 1 t3 1
Time Value
-------------
t1 v1
t1 v2
t1 v3
t2 v1
t2 v3
t3 v1
t4 v2
t4 v3
我正在尝试创建一个查询,将数据汇总如下:
Time v1 v2 v3
t1 1 1 1
t2 1 0 1
t3 1 0 0
t4 0 1 1
where (ti,vj) = 1 if record (ti,vj) record appeared in #t_timevalue
(ti,vj) = 0 elsewhere
是否可以使用SQL生成这样的输出
或至少是目标摘要信息:
1 1 1
1 0 1
1 0 0
0 1 1
编辑
列Value
包含未知值,它们的计数似乎很大。
将此报告向上推的建议解决方案是否由应用程序层而不是数据库层操作 我认为您可以使用条件聚合:
select time,
max(case when value = 'v1' then 1 else 0 end) as v1,
max(case when value = 'v2' then 1 else 0 end) as v2,
max(case when value = 'v3' then 1 else 0 end) as v3
from t
group by time
order by time;
编辑:
如果没有太多的值(SQL Server表或结果集中的列数有限制),可以使用动态透视来实现这一点:
pivot操作符也适用于您
create table testrr
(
[Time] varchar(30),
[Value] varchar(30)
)
insert into testrr values
('t1','v1'),
('t1','v2'),
('t1','v3'),
('t2','v1'),
('t2','v3'),
('t3','v1'),
('t4','v2'),
('t4','v3')
SELECT
[Time],[v1],[v2],[v3]
FROM
(
SELECT
[Time],[Value],1 AS NUMBER
FROM testrr
) SRC
PIVOT
(
count(NUMBER) FOR [Value] IN ([v1],[v2],[v3])
) pvt
--Output
/*
Time v1 v2 v3
------------------------------ ----------- ----------- -----------
t1 1 1 1
t2 1 0 1
t3 1 0 0
t4 0 1 1
*/
致以最良好的祝愿
威尔实际上,我不知道这些值(v1、v2、v3,…),它们是数据,所以我不能硬编码它们。另一方面,值的计数似乎很大而且未知。感谢@Gordon,我已经测试过了,当值计数很小(低于4095)时,它工作得非常好,对于大量的值,我收到以下错误消息:
选择列表中的元素数超过了允许的最大4096个元素数。
这就解释了它自己。@Lio。正如我所说。“如果你没有太多的值”。是的,这很清楚,在这种情况下也能起作用,非常感谢。谢谢你会的,但正如我对@Gordon的回答所评论的,值(v1、v2、v3,…)并不确切,它们是数据,硬编码是不可行的。我知道你的想法,这也可以应用到动态SQL中
create table testrr
(
[Time] varchar(30),
[Value] varchar(30)
)
insert into testrr values
('t1','v1'),
('t1','v2'),
('t1','v3'),
('t2','v1'),
('t2','v3'),
('t3','v1'),
('t4','v2'),
('t4','v3')
SELECT
[Time],[v1],[v2],[v3]
FROM
(
SELECT
[Time],[Value],1 AS NUMBER
FROM testrr
) SRC
PIVOT
(
count(NUMBER) FOR [Value] IN ([v1],[v2],[v3])
) pvt
--Output
/*
Time v1 v2 v3
------------------------------ ----------- ----------- -----------
t1 1 1 1
t2 1 0 1
t3 1 0 0
t4 0 1 1
*/