2016-07-29 7 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 용량 RAM, 하드 디스크 드라이브 용량 (GB) - hd, CD-ROM 속도 (예 : '4x') - cd 및 가격.

  • 랩톱 테이블은 CD-ROM 속도 대신 화면 크기 (인치) - 화면을 포함한다는 점을 제외하면 PC 테이블과 유사합니다.
  • 프린터 테이블의 각 프린터 모델에 대한 출력 유형 ('y'는 단색) - 색상 필드, 인쇄 기술 ('Laser', 'Jet'또는 'Matrix') - 유형 , 가격이 지정됩니다.

Product 테이블에서 각 모델의 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