2013-04-18 1 views
1

약간의 SQL 문제에 대한 질문이 있습니다.Item1 및 Item1 + 'char'에 대해 SUM을 계산하는 방법

는 예를 들어,이 같은 테이블 을 가지고 : 당신이 볼 수 있듯이, 아이템이 할 수있는 값을 가질 수

| ITEM | VALUE | 
|A0001 | 3  | 
|A0001 | 2  | 
|A0002 | 2  | 
|A0003 | 7  | 
|A0003 | 3  | 
|A0003U | 2  |

. 그래서 내가 이미 한 것은 SUM() 각 값에 합계을 얻기 위해 각 값을 첨부하는 것입니다. 내가 지금하고 싶은 무엇

는 항목 A0003U 될 것를 들어, 값의 SUM이 항목 + 'U'는 예를 들어

를 아이템과과에 연결된 값을 추가한다

7 (아이템의 라인 1) + 3 (항목의 입력란 2) + 2 (항목의 입력란 1 + 'U') =

난 함수 RIGHT를 사용할 수 있다는 것을 알고 12 (아이템 , 1) 그것은 'U'와 끝나는 경우 'U'를 반환하지만, 나는 끝내지 않습니다. 모든 계산을하는 법을 아십시오.

편집 :

resulset가 있어야한다 :

| ITEM | VALUE | 
|A0001 | 5  | 
|A0002 | 2  | 
|A0003 | 12  |
+0

당신이 원하는 결과의 예 설정을 게시 할 수 있습니까? – Lamak

+0

그들은 너비가 고정 될 것입니까? A00010 A00010U가 있습니까? – Paparazzi

+0

아니요, 너비가 같을 필요는 없습니다. 여기에 문제가 있습니다 :/ – lour

답변

2

내가 지나치게 생각을 OP가 예상 결과 세트를 추가하기 전에 문제.

| ITEM | VALUE | 
|A0001 | 5  | 
|A0002 | 2  | 
|A0003 | 10 | 
|A0003U | 12 | 

그것은 유용한 것으로 판명 수 있습니다 :

SELECT 
    a.ITem 
    ,CASE 
     WHEN RIGHT(a.ITEM,1)='U' 
     THEN SUM(b.VALUE) 
     ELSE SUM(a.VALUE) 
     END AS VALUE 
FROM table1 a 
LEFT JOIN table1 b 
    ON a.ITEM = b.ITEM + 'U' 
    OR (RIGHT(a.ITEM,1)='U' AND a.ITEM = b.ITEM) 
GROUP BY a.ITem 

SQLFiddle DEMO

편집 :

원하는 출력 뭔가 같은 것 그럼에도 불구하고 여기에 쿼리입니다 단순화 된 (실제) 버전의 문제에 대한 쿼리 :

Select 
    CASE 
    WHEN RIGHT(ITEM,1) = 'U' THEN SUBSTRING(ITEM,0,LEN(ITEM)) 
    ELSE ITEM 
    END AS ITEM 
    ,SUM(VALUE) as VALUE 
From Table1 
GROUP BY 
    CASE 
    WHEN RIGHT(ITEM,1) = 'U' THEN SUBSTRING(ITEM,0,LEN(ITEM)) 
    ELSE ITEM 
    END 

SQLFiddle DEMO

+0

고마워, 나는이 일을 조금 해본 후 내가 기대 한 결과를 얻을 수있을 것이라고 생각한다. – lour

+0

@lour - 쿼리 # 2로 업데이트 된 답변 확인 –

+0

대단히 감사합니다. – lour

6

이이 항목 열의 처음 5 개 문자를 복용하고 그들에 의해 그룹화하여 값을 요약합니다. 이 U 항상 마지막 문자라고 가정 U

Select Left(ITEM,5), 
     SUM(VALUE) 
From Table 
Group by Left(ITEM,5) 

편집

로 끝나는 항목이 포함됩니다 만 다음이 대체 사용할 수 있습니다 한 번에 표시됩니다

Select Case 
      When CHARINDEX('U', ITEM) > 0 Then LEFT(ITEM, CHARINDEX('U', ITEM)-1) 
      Else ITEM 
     End, 
     SUM(VALUE) 
From Table 
Group by Case 
      When CHARINDEX('U', ITEM) > 0 Then LEFT(ITEM, CHARINDEX('U', ITEM)-1) 
      Else ITEM 
      End 
+0

오, 들리네.그러나 실제로 모든 항목에는 길이가 동일하지 않습니다. 예를 들어 보겠습니다. 예를 들어 ** 12345 **라는 항목과 * 12345678 **이라는 항목을 가질 수 있지만 둘 다 "U-double"을 가질 수 있습니다. – lour

+0

@lour 'U'는 항상 끝에 있습니까? 그리고 항상 한 캐릭터? – codingbadger

+0

예, U는 항상 끝에 있지만 항목 이름은 다른 문자를 포함 할 수 있습니다. "RN0005"또는 "RN006PU"와 같습니다. – lour

관련 문제