sql

时间:2016-07-29 18:36:26

标签: sql sum

数据库方案由四个表组成:

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及其价格。

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

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

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

2 个答案:

答案 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