首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >sql中的位数和

sql中的位数和
EN

Stack Overflow用户
提问于 2016-07-30 02:36:26
回答 2查看 2.6K关注 0票数 0

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

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‘、'Laptop’或'Printer')的数据。假设产品表中的型号对于所有制造商和产品类型都是唯一的。
  • PC表中的每台个人计算机都由唯一的代码明确地标识,并且还具有其型号(外键指的是产品表)、处理器速度(以MHz为单位)-速度字段、ram容量(以Mb为单位)- RAM、硬盘驱动器容量(以Gb为单位)- hd、CD-ROM速度(例如'4x') - cd以及其价格的特征。
  • 笔记本电脑桌面类似于PC桌面,不同之处在于它包含屏幕尺寸(以英寸为单位)-屏幕,而不是光盘速度。
  • 对于打印机表中的每个打印机型号,将指定其输出类型(‘y’表示彩色,‘n’表示单色)-颜色字段、打印技术(‘激光’、‘喷气’或‘矩阵’)-类型和价格。

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

请告诉我怎么解决这个问题。我是中级的sql技能,不能解决这个问题。

EN

回答 2

Stack Overflow用户

发布于 2016-07-30 02:42:03

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

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
票数 2
EN

Stack Overflow用户

发布于 2019-05-23 03:49:09

此解决方案通过检查

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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38665486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档