总和的数字

问题描述:

数据库方案由四个表:总和的数字

Product(maker, model, type)  
PC(code, model, speed, ram, hd, cd, price)  
Laptop(code, model, speed, ram, hd, screen, price)  
Printer(code, model, color, type, price) 
  • 产品表包含制造商的数据,型号和产品(“PC”的类型,“笔记本电脑”或“打印机”)。假定产品表中的型号对于所有制造商和产品类型都是唯一的。

  • PC表格中的每台个人计算机都通过一个唯一的代码明确标识,并且还以其型号(外键指产品表),处理器速度(以MHz为单位) - 速度字段,RAM容量( Mb) - 内存,硬盘驱动器容量(以Gb为单位) - 高清,CD-ROM速度(例如'4x') - cd及其价格。

  • 笔记本电脑表与PC表类似,不同之处在于它不包含CD-ROM的速度,而是包含屏幕大小(英寸) - 屏幕。
  • 对于Printer表中的每种打印机型号,其输出类型('y'表示颜色,'n'表示单色) - 色域,打印技术('Laser','Jet'或'Matrix') - 类型,并指定价格。

从产品表中计算每个型号的ID(型号列)中的位数总和。 结果集:模型,数字之和

请告诉我如何解决它。我是中级SQL技能,无法解决这个问题。

+2

我们修复您编写的代码。我们不是在这里为你写的。 –

+0

'n%10 + n/10%10 + n/100%10 ...''%'是模数/余数运算,可能是您平台上的mod()函数。这实际上是一个数学问题,而不是“SQL”问题。如果你的ID是一个字符串,你必须转换为int。如果长度超过9个字符,则应使用“bigint”或将其分解成小块。 – shawnt00

+0

@MarcB SO不仅仅是“修复你编写的代码”。这不是一个调试服务。我们*通过提供信息和分享知识来回答问题*。 *一些*狭义范围的问题要求代码很好。但是,无论你如何描述它,请不要促进我们在这里修复其他人的代码的想法;这不仅仅是为人们编写代码。 – jpmc26

好的,在两个函数的帮助下,我们可以将您的模型数字解析为数字,然后得到数字的总和。

Select [dbo].[udf-Stat-Sum-of-Digits](12345)  -- Returns 15 
Select [dbo].[dbo].[udf-Str-Numbers]('AF567-56') -- Returns 56756 

的好消息是,如下图所示

Declare @Table table (model varchar(50)) 
Insert into @Table values 
('AF567-56'), 
('25-a-467'), 
('11156 25') 

Select Model 
     ,Digits = [dbo].[udf-Str-Numbers](Model) 
     ,SumOfDigits = [dbo].[udf-Stat-Sum-of-Digits]([dbo].[udf-Str-Numbers](Model)) 
From @Table 

返回

Model  Digits SumOfDigits 
AF567-56 56756 29 
25-a-467 25467 24 
11156 25 1115625 21 

两个UDF的

CREATE Function [dbo].[udf-Stat-Sum-of-Digits](@Val int) 
Returns Int 
As 
Begin 

Declare @RetVal as int 

;with i AS (
    Select @Val/10 n, @Val % 10 d 
    Union ALL 
    Select n/10, n % 10 
    From i 
    Where n > 0 
) 
Select @RetVal = SUM(d) FROM i; 

Return @RetVal 

END 

第二个功能

我们可以结合这些
CREATE FUNCTION [dbo].[udf-Str-Numbers](@String varchar(250)) 
Returns Varchar(250) 
As 
Begin 
    Declare @RetVal varchar(250) = @String 
    ;with cteChar as (Select Cnt=1,Str=Char(1) Union All Select Cnt=B.Cnt+1,Str=Char(B.Cnt+1) From cteChar as B Where B.Cnt <= 255) 
    Select @RetVal = Replace(@RetVal,Str,'') From cteChar where str not like '[0-9]' Option (maxrecursion 256) 
    Return case when IsNull(@RetVal,'')='' then @String else @RetVal end 
END