总和的数字
问题描述:
数据库方案由四个表:总和的数字
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技能,无法解决这个问题。
答
好的,在两个函数的帮助下,我们可以将您的模型数字解析为数字,然后得到数字的总和。
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
我们修复您编写的代码。我们不是在这里为你写的。 –
'n%10 + n/10%10 + n/100%10 ...''%'是模数/余数运算,可能是您平台上的mod()函数。这实际上是一个数学问题,而不是“SQL”问题。如果你的ID是一个字符串,你必须转换为int。如果长度超过9个字符,则应使用“bigint”或将其分解成小块。 – shawnt00
@MarcB SO不仅仅是“修复你编写的代码”。这不是一个调试服务。我们*通过提供信息和分享知识来回答问题*。 *一些*狭义范围的问题要求代码很好。但是,无论你如何描述它,请不要促进我们在这里修复其他人的代码的想法;这不仅仅是为人们编写代码。 – jpmc26