数据库方案由四个表组成:
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”,“笔记本电脑”或“打印机”)的数据。假设Product表中的型号对于所有制造商和产品类型都是唯一的。
PC表中的每台个人计算机都由唯一代码明确标识,并且其特征还在于其型号(外键指产品表),处理器速度(以MHz为单位) - 速度字段,RAM容量(在Mb中) - 内存,硬盘驱动器容量(以Gb为单位) - 高清,CD-ROM速度(例如,'4x') - cd及其价格。
从Product表计算每个模型的ID(模型列)中的数字总和。 结果集:模型,数字之和
请告诉我如何解决它。我是中级sql技能,无法解决这个问题。
答案 0 :(得分:1)
好的,在两个函数的帮助下,我们可以将您的模型编号解析为数字,然后得到数字的总和。
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
答案 1 :(得分:0)
此解决方案通过了支票
SELECT model,
1 * (DATALENGTH(model) - DATALENGTH(REPLACE(model, '1', ''))) +
2 * (DATALENGTH(model) - DATALENGTH(REPLACE(model, '2', ''))) +
3 * (DATALENGTH(model) - DATALENGTH(REPLACE(model, '3', ''))) +
4 * (DATALENGTH(model) - DATALENGTH(REPLACE(model, '4', ''))) +
5 * (DATALENGTH(model) - DATALENGTH(REPLACE(model, '5', ''))) +
6 * (DATALENGTH(model) - DATALENGTH(REPLACE(model, '6', ''))) +
7 * (DATALENGTH(model) - DATALENGTH(REPLACE(model, '7', ''))) +
8 * (DATALENGTH(model) - DATALENGTH(REPLACE(model, '8', ''))) +
9 * (DATALENGTH(model) - DATALENGTH(REPLACE(model, '9', ''))) AS 'qty'
FROM product