操作数数据类型varchar对sum运算符无效

问题描述 投票:1回答:4

我试试这个查询

Select 
S.Name,S.No,
SUM(Case when s.Model='Cultus' then total else 0 end) as Cultus,
SUM(Case when s.Model ='vigo' then total else 0 end) as vigo,
SUM(total) total_v ,
 s.MA,MAX(S.Speed) Speed
 from (
Select
 RVU.Name,RVU.No,VV.Model,count(VV.Model) as total, RVU.MA as MA,RVU.Speed 
from 
 VV 
inner join RVU
on VV.MID=RVU.ID 
inner join RU on RVU.RID= RU.RID
    WHERE 
RU.StartDate>= '2016-04-01 00:00:00' and
RU.EndDate<='2016-04-30 23:59:59'   and
RU.Region= 'Paris'
and RVU.No= '651' AND Model <> ''
Group By RVU.Name,RVU.RegNo,VV.Model,RVU.MA,RVU.Speed ) S
GROUP BY
s.RegNo,s.Name,S.MA

产量

Name    No  Cultus  vigo    total_v   MA       Speed
David   651    2    0        2         1048      124
David   651    3    0        3         597      345
David   651    1    0        1         606     101
David   651    3    2        5         992     110

当我试试这个

Sum(MA) MA,

这显示错误

操作数数据类型varchar对sum运算符无效。

我想要这样的结果

Name    No     Cultus   vigo    total_v   MA    Speed
David   651    9         2       11       1799    345

UPDATE

当我试试这个

SUM(CASE ISNULL(MA,'') WHEN '' THEN 0 ELSE CAST(MA AS INT) END),

还有这个

sum(cast (MA as int))

那么输出就是

 Name   No  Cultus  vigo    total_v     MA     Speed
David   651    2    0        2          4192     124
David   651    3    0        3         2388      345
David   651    1    0        1         2424      101
David   651    3    2        5         4960      110

更新2:

当我只执行这部分时,这会显示具有相同数据的多个记录

 Select
     RVU.Name,RVU.No,VV.Model,count(VV.Model) as total, RVU.MA as MA,RVU.Speed 
    from 
     VV 
    inner join RVU
    on VV.MID=RVU.ID 
    inner join RU on RVU.RID= RU.RID
        WHERE 
    RU.StartDate>= '2016-04-01 00:00:00' and
    RU.EndDate<='2016-04-30 23:59:59'   and
    RU.Region= 'Paris'
    and RVU.No= '651' AND Model <> ''
    Group By RVU.Name,RVU.RegNo,VV.Model,RVU.MA,RVU.Speed

看起来价值完全改变

sql sql-server sum
4个回答
1
投票

RVU.MA列中可能存在字符串值。尝试使用以下查询来找出这种差异。

   SELECT *
   FROM RVU
   WHERE ISNUMERIC (RVU.MA)!=1

1
投票

您可以使用以下语法来获得答案。

select sum(cast(columnname as int)) from TableName

尝试应用此语法,

select sum(cast(s.MA as int)) from (
Select
 RVU.Name,RVU.No,VV.Model,count(VV.Model) as total, RVU.MA as MA,RVU.Speed 
from 
 VV 
inner join RVU
on VV.MID=RVU.ID 
inner join RU on RVU.RID= RU.RID
WHERE 
RU.StartDate>= '2016-04-01 00:00:00' and
 RU.EndDate<='2016-04-30 23:59:59'   and
RU.Region= 'Paris'
and RVU.No= '651' AND Model <> ''
Group By RVU.Name,RVU.RegNo,VV.Model,RVU.MA,RVU.Speed ) S

检查此查询,您是否能够选择记录并在查询中应用此逻辑。

你的最终查询看起来像,

Select 
S.Name,S.No,
SUM(Case when s.Model='Cultus' then total else 0 end) as Cultus,
SUM(Case when s.Model ='vigo' then total else 0 end) as vigo,
SUM(total) total_v ,
sum(cast(s.MA as int)),MAX(S.Speed) Speed
from (
Select
RVU.Name,RVU.No,VV.Model,count(VV.Model) as total, RVU.MA as MA,RVU.Speed 
from 
VV 
inner join RVU
on VV.MID=RVU.ID 
inner join RU on RVU.RID= RU.RID
WHERE 
RU.StartDate>= '2016-04-01 00:00:00' and
RU.EndDate<='2016-04-30 23:59:59'   and
RU.Region= 'Paris'
and RVU.No= '651' AND Model <> ''
Group By RVU.Name,RVU.RegNo,VV.Model,RVU.MA,RVU.Speed ) S
GROUP BY
s.RegNo,s.Name,S.MA

0
投票
create table #t
(
id varchar(20))



insert into #t
select '2'
union all
select '3'

select sum(id) from #t--this fails

你需要这样做

select sum(cast (id as int))--cast from 2008 onwards
from #t

在您的情况下,MA列的类型为Varchar


0
投票

似乎您的一个MA列值是varchar的类型,请检查您的数据

如果您的数据类型varchar然后转换为INT:

SUM(CASE ISNULL(MA,'') WHEN '' THEN 0 ELSE CAST(MA AS INT) END)

DECLARE @tblTest as Table(
    Name VARCHAR(10),
    No INT,
    Cultus  INT,
    vigo INT,
    total_v INt,
    MA VARCHAR(5),
    Speed INT
)

INSERT INTO @tblTest VALUES
('David',651,2,0,2,1048,124)
,('David',651,3,0,3,597,345)
,('David',651,1,0,1,606,101)
,('David',651,3,2,5,992,110)

SELECT
    Name,[No],SUM(Cultus),
    SUM(vigo) AS vigo ,SUM(total_v) AS total_v,
    SUM(CASE ISNULL(MA,'') WHEN '' THEN 0 ELSE CAST(MA AS INT) END) AS MA,
    MAX(Speed) AS Speed
FROM @tblTest
GROUP BY Name,[No]
© www.soinside.com 2019 - 2024. All rights reserved.