2017-05-19 4 views
0

둘 다 varchar FieldName 및 FieldValue 두 개의 열이있는 테이블이 있습니다. 필드 이름을/fieldValue의은과 같이 유효 기간 또는 수량 수 :GROUP BY 여러 데이터 형식

enter image description here

가 나는 UNION 그것을 밖으로 분할없이 최대 수량 바람직 최대 유효 기간 모든 행과 그룹을 선택하고 싶습니다.

SELECT 
    FieldName, 
    CASE FieldName 
     WHEN 'Quantity' 
      THEN MAX(CAST(FieldValue AS NUMERIC)) 
     WHEN 'Expiry' 
      THEN MAX(CAST(FieldValue AS DATE)) 
    END AS FieldValue 
FROM MyTable 
GROUP BY FieldName; 

가이 같은 데이터 유형을 혼합 할 수 있습니다 :

나는 다음과 같은 있지만 받았다 "숫자가 날짜와 호환되지 않는 피연산자 유형 충돌을"시도?

+1

앞에'case' 표현의 반환 데이터 형식이 호환되어야합니다. (숫자와 날짜는 맞지 않습니다.) – jarlh

+0

샘플 테이블 데이터와 예상 결과를 모두 서식있는 텍스트로 추가하십시오. – jarlh

+0

VARCHAR에 대한 CAST MAX 값 - 두 번째 열은 항상 VARCHAR입니다. – i486

답변

0

No.
"FieldValue"라는 레이블을 지정하는 열에는 지정된 데이터 형식이 있어야합니다. 당신은 하나에 두 가지 유형을 넣고있어!

이 값을 모두 가질 필요가있는 경우, 다음을 고려 : 더 나은이 할

SELECT 
    FIELDNAME 
    ,FIELDVALUE 
FROM (
    SELECT 
     FieldName, 
     CASE FieldName 
      WHEN 'Quantity' 
       THEN CAST(MAX(CAST(plm.CodeValue AS NUMERIC)) AS VARCHAR(50)) 
      WHEN 'Expiry' 
       THEN CAST(MAX(CAST(plm.CodeValue AS DATE)) AS VARCHAR(50)) 
     END AS FieldValue 
    FROM MyTable) A 
GROUP BY FieldName; 
+0

plm.CodeValue가 이미 varchar가 아닌가요? 왜 두 번 캐스팅해야합니까? – jarlh

+0

감사합니다! 불행히도, 하위 쿼리에 GROUP BY가 없으면 FieldValue에서 MAX를 수행 할 수 없다고 생각합니다. 감사합니다 i486. – 362mike362

1

을 - 당신이 그룹 만 정확히 두 값이 : 일반적으로

SELECT 'Quantity' AS Type, CAST(MAX(CAST(FieldValue AS NUMERIC)) AS VARCHAR) AS MaxValue 
    FROM MyTable WHERE FieldName='Quantity' 
UNION 
    SELECT 'Expiry', CAST(MAX(CAST(FieldValue AS DATE)) AS VARCHAR) 
    FROM MyTable WHERE FieldName='Expiry' 

를, 그것은이다 서로 다른 종류의 값을 같은 열에 넣는 것은 좋지 않습니다. FieldName에는 현재 값 (Qty/Exp)과 Quantity에 대해 하나씩 그리고 빈 (NULL) 값이 가능한 만료에 대해 하나씩 두 개의 다른 열이있을 수 있습니다.

+0

. 네, 저는 이전에 UNION을 테스트 했었습니다. 테이블에있는 데이터가 실제로 사용한 예제보다 다양하기 때문에 UNION 없이도이 작업을 수행 할 수 있기를 바랬습니다. – 362mike362

0

안녕하세요, 시도 -

select FieldName, 
CASE 
WHEN FieldName = 'Quantity' THEN 
    cast((select max(cast(FieldValue as numeric)) from #tmp where 
FieldName='Quantity') as varchar) 
else 
cast((select max(cast(FieldValue as date)) from #tmp where 
FieldName='Expiry') as varchar) 
end as 'New' 
from MyTable