2016-07-29 42 views
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」的類型,「筆記本電腦」或「打印機」)。假定產品表中的型號對於所有制造商和產品類型都是唯一的。

  • 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

回答

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