2011-09-14 3 views
-2

아마도 sql을 사용하면 복잡성 수준이 증가 할 때 어지럽게됩니다. for 루프를 넣고 C#으로 작업하는 것이 더 쉽습니다.행의 그룹화를 기반으로 결과 집합을 요약하거나 요약하지 않습니다.

나는

6. 나는이 결과는 같은 FIELD2가있는 경우 요약 한 행을 반환하려면,

select.field1,.field2, field3,field4 
from table1 

같은 쿼리를이 행 1, 2, 3, 4, 5를 반환 가정이 있고 field3. 행의 ANY가 다른 경우 모든 행을 리턴합니다.

미리 감사드립니다.

다음은 샘플 데이터입니다. 이 lis 행에서 1 번과 4 번 행은 상위 항목이고 다른 하나는 하위 항목입니다. 요약하면, 1 행은 행 번호 (6)이기 때문에 4 아이들의 행으로 요약되지 않은 모든 하위 항목하지만, 행 번호와 내가

을 반환하려면 여기에 2

Field1 Field2 Field3 Field4(parentid) 
1  paper cash null 
2  Paper cash  1 
3  paper cash  1 
4  paper cash  null 
5  paper cash  4 
6  pen cash 4 

다른 값 필드를 가지고 요약

field1 Field2 Field3 field4(all the child's id) 
1  paper cash  (2,3) 
4  paper cash  null 
5  paper cash  null 
6  pen cash  null 

희망 사항이 더 좋을 것입니다.

+0

샘플 데이터와 원하는 결과를 표시하고 사용중인 SQL Server의 버전을 지정하십시오. –

+0

샘플 데이터를 추가했습니다. 이해가 되니? – WorkerThread

+0

어떤 버전의 SQL Server를 사용 하시겠습니까? –

답변

0

SQL Server를 사용하면 연결을 지원하는 함수와 후 처리를 지원하는 #temp 테이블을 만들어야합니다 (전체 소스 테이블에서 함수를 반복적으로 호출하지 않도록). 지난 10 년 동안 릴리스 된 데이터베이스 플랫폼으로 이동하면 훨씬 효율적인 솔루션을 손쉽게 얻을 수 있습니다. :-)

설정 :

USE tempdb; 
GO 

CREATE TABLE dbo.[Sample] 
(
    Field1 INT, 
    Field2 VARCHAR(32), 
    Field3 VARCHAR(32), 
    Field4 INT 
); 

INSERT dbo.[Sample] SELECT 1,'paper','cash', NULL 
UNION ALL SELECT 2,'Paper','cash', 1 
UNION ALL SELECT 3,'paper','cash', 1 
UNION ALL SELECT 4,'paper','cash', NULL 
UNION ALL SELECT 5,'paper','cash', 4 
UNION ALL SELECT 6,'pen', 'cash', 4; 
GO 

기능 :

CREATE FUNCTION dbo.ConcatIDs 
(
    @Field1 INT 
) 
RETURNS VARCHAR(8000) 
AS 
BEGIN 
    DECLARE @s VARCHAR(8000); 
    SELECT @s = COALESCE(@s + ',', '') 
     + CONVERT(VARCHAR(12), Field1) 
     FROM dbo.[Sample] AS s 
     WHERE Field4 = @Field1 
     AND NOT EXISTS 
     (
     SELECT 1 
      FROM dbo.[Sample] 
      WHERE Field4 = s.Field4 
      AND Field1 <> s.Field1 
      AND (Field2 <> s.Field2 OR Field3 <> s.Field3) 
    ); 
    RETURN @s; 
END 
GO 

쿼리 :

SELECT Field1, Field2, Field3, Field4, f4 = dbo.ConcatIDs(Field1) 
    INTO #x 
    FROM dbo.[Sample]; 

SELECT Field1, Field2, Field3, 
    [field4(all the child's id)] = '(' + f4 + ')' 
FROM #x AS x1 
WHERE NOT EXISTS 
(
    SELECT 1 FROM #x AS x2 
    WHERE x2.Field1 = x1.Field4 
    AND x2.f4 IS NOT NULL 
); 

DROP TABLE #x; 

결과 :

Field1 Field2 Field3 field4(all the child's id)  
------ ------ ------ -------------------------- 
1  paper cash (2,3) 
4  paper cash NULL 
5  paper cash NULL 
6  pen cash NULL 

정리 :

DROP TABLE dbo.[Sample]; 
DROP FUNCTION dbo.ConcatIDs; 
+0

정말 고마워요. 나는 환호를위한 새싹 빛을 보낼 수 있으면 좋겠다. – WorkerThread

+1

원한다면 내 주소를 보낼 수 있지만 맥주를 보내려면 맥주를 보내십시오. :-) –

+0

참고로 단 하나의 행이 있고 자식 행이 부모 행과 다른 경우이 쿼리는 작동하지 않습니다. catcatenated 필드에서 하나의 값이지만 여전히 ID를 연결합니다. – WorkerThread

관련 문제