【发布时间】:2017-01-21 09:33:12
【问题描述】:
【问题讨论】:
标签: sql sql-server sum type-conversion
【问题讨论】:
标签: sql sql-server sum type-conversion
下面的查询应该在 MS SQL 中为您提供所需的输出。
select id , (convert (int,OK_1112) + convert (int,OK_1213) + convert (int,OK_1314)+convert (int,OK_1516)) AS total from Table_Name
这里,id 列在 int 中,OK_1112、OK_1213、OK_1314、OK_1516 列的类型为 bit。
【讨论】:
如果您有大量的 OK 字段,并且不想对其进行编码,请尝试以下操作
Declare @YourTable table (Id int,OK_1112 bit,OK_1213 bit,OK_1314 bit,OK_1415 bit,OK_1516 bit)
Insert into @YourTable values
(3 ,1,1,0,0,0),
(17,0,0,0,0,0),
(21,0,0,1,1,1),
(24,1,1,0,0,0)
Declare @XML xml
Set @XML = (Select * from @YourTable for XML RAW)
Select ID,Total=Sum(cast(Value as int))
From (
Select ID = r.value('@Id','int')
,Item = attr.value('local-name(.)','varchar(100)')
,Value = attr.value('.','varchar(max)')
From @XML.nodes('/row') as A(r)
Cross Apply A.r.nodes('./@*[local-name(.)!="Id"]') as B(attr)
) A
Group By ID
返回
ID Total
3 2
17 0
21 3
24 2
仅供参考,如果您只是运行子查询,您将看到以下内容
ID Item Value
3 OK_1112 1
3 OK_1213 1
3 OK_1314 0
3 OK_1415 0
3 OK_1516 0
17 OK_1112 0
17 OK_1213 0
17 OK_1314 0
17 OK_1415 0
17 OK_1516 0
21 OK_1112 0
21 OK_1213 0
21 OK_1314 1
21 OK_1415 1
21 OK_1516 1
24 OK_1112 1
24 OK_1213 1
24 OK_1314 0
24 OK_1415 0
24 OK_1516 0
【讨论】:
出于教育目的,这里是带有UNPIVOT的版本:
DECLARE @t TABLE (id INT, ok1112 bit, ok1213 BIT, ok1314 BIT, ok1415 BIT, ok1516 BIT)
INSERT INTO @t VALUES
(3, 1, 1, 0, 0, 0),
(17, 0, 0, 0, 0, 0),
(21, 0, 0, 1, 1, 1),
(24, 1, 1, 0, 0, 0)
SELECT id, SUM(CAST(a AS int)) AS Total
FROM @t
UNPIVOT(a FOR b IN(ok1112, ok1213, ok1314, ok1415, ok1516))u
GROUP BY id
【讨论】:
将bit 转换为Int 并进行算术运算
select id,cast([Ok_1112] as Int)+cast([Ok_1213] as Int)+...
From yourtable
【讨论】: