2014-09-15 1 views
1

모든 가능한 독특한 순열 1 개 문자열로 여러 열을 결합 : 나는 SubBuildingName을 결합하는 각 주소에 대한SQL - 나는 다음 표했다

AddressId  SubBuildingName BuildingName BuildingNumber Postcode 
12345   Flat 1    SomeBuilding 80    MK34 1PU 
12346   Flat 2    SomeBuilding 80    MK34 1PU 
12347   Flat 7    OtherBuilding NULL    MK22 9IT 

필요 BuildingName 1 쉼표로 구분 된 문자열로 BuildingNumber 가능한 모든 비 반복적 치환에서 다음과 같이 표현할 수있다 :

AddressId  AddressLine1 
12345   Flat 1, SomeBuilding, 80 
12345   Flat 1, 80, SomeBuilding 
12345   80, Flat 1, SomeBuilding 
12345   80, SomeBuilding, Flat 1 
12345   SomeBuilding, Flat 1, 80 
12345   SomeBuilding, 80, Flat 1 
12346   Flat 1, SomeBuilding, 80 
12346   Flat 1, 80, SomeBuilding 
12346   80, Flat 1, SomeBuilding 
12346   80, SomeBuilding, Flat 1 
12346   SomeBuilding, Flat 1, 80 
12346   SomeBuilding, 80, Flat 1 
12347   Flat 7, OtherBuilding 
12347   OtherBuilding, Flat 7 
+2

여기에서 필요성을 이해하는 데 문제가 있습니다. 왜 그런 결과 집합을 원하니? 당신이 다른 select와 union에서 가능한 모든 순열을 만들 수 있다고 가정합니다. – xQbert

+0

위에서 설명한대로 가능한 순열을 계산할 필요가 있습니다. 물론 6 개의 유니온을 하드 코딩 할 수 있지만, 더 많은 열이 포함되면 더 많은 순열이 가능합니다. 4 개의 열을 결합하면 24 개의 순열이 있습니다! – RobW

+4

그가 물어 보는 것이 불분명하기 때문에 닫기로 결정한 사람들에게, 나는 그가 무엇을 요구하는지 확실히 분명히 생각한다. 그가 묻는 것은 이상한 일이지만 확실한 것은 확실합니다. –

답변

2

당신이 앞으로 사용할 열 시간을 알고 있다면, 당신은 UNPIVOT 여러가를 달성하기 위해 자기 조인 사용할 수있는 6 개 개의 잠재적 인 주문을 처리합니다

DECLARE @Permutations TABLE (ID INT IDENTITY(1,1), v1 VARCHAR(10), v2 VARCHAR(10), v3 VARCHAR(10), v4 VARCHAR(10)) 

INSERT INTO @Permutations (v1, v2, v3, v4) VALUES ('a', 'b', 'c', 'd') 
INSERT INTO @Permutations (v1, v2, v3, v4) VALUES ('w', 'x', 'y', 'z'); 

WITH alldata AS (
SELECT ID, Value, ValName 
FROM 
    @Permutations 
UNPIVOT 
(Value FOR ValName IN (v1, v2, v3, v4)) up 
) 

SELECT 
    one.ID AS AddressID, 
    one.Value + ',' + two.Value + ',' + three.Value + ',' + four.Value AS AddressLine1 
FROM 
    alldata one 
    INNER JOIN 
    alldata two ON 
     one.ID = two.ID AND 
     one.ValName <> two.ValName 
    INNER JOIN 
    alldata three ON 
     one.ID = three.ID AND 
     one.ValName <> three.ValName AND 
     two.ValName <> three.ValName 
    INNER JOIN 
    alldata four ON 
     one.ID = four.ID AND 
     one.ValName <> four.ValName AND 
     two.ValName <> four.ValName AND 
     three.ValName <> four.ValName 
ORDER BY AddressID, AddressLine1 

편집 : 예를 들면 다음과 같은 스물 네 문 작성하지 않고도 모든 순열 효과를 영업 이익은 만족 것인지 내가 코드 작업을 시작한 이후에 게시 읽기 코멘트, 난 분명하지 않다 이런 식의 코드를 보게된다. (4 개의 컬럼에 대해 4 개의 선언문을 쓰고 24 개의 UNION을 사용하는 대신 5 개의 f 또는 5 등) 또는 전체가 동적이어야합니다. 이 대답은 각 가능한 순열을 수동으로 고려하지 않고 최소한의 코드를 작성하는 기술을 찾고있는 경우에만 만족할 것입니다.

+0

완벽하게,이 작품은 나를 위해 (내 조인을 일부 열에 NULL을 포함 할 수 있으므로 왼쪽 조인을 변경해야했다) – RobW

1

그것은 연합의 특징이다. 합체는 null 값 을 처리하는 데 사용되며, 각각의 문은

SELECT AddressId, 
     CONCAT(coalesce(SubBuildingName,''), ', ', 
       coalesce(BuildingName,''), ', ', 
       coalesce(BuildingNumber,'') 
     ) AS AddressLine1 
FROM MyTable 
UNION 
SELECT AddressId, 
     CONCAT(coalesce(SubBuildingName,''), ', ', 
       coalesce(BuildingNumber,''), ', ', 
       coalesce(BuildingName,'') 
     ) AS AddressLine1 
FROM MyTable 
UNION 
SELECT AddressId, 
     CONCAT(coalesce(BuildingNumber,''), ', ', 
       coalesce(BuildingName,''), ', ', 
       coalesce(SubBuildingName,'') 
     ) AS AddressLine1 
FROM MyTable 
UNION 
SELECT AddressId, 
     CONCAT(coalesce(BuildingNumber,''), ', ', 
       coalesce(SubBuildingName,''), ', ', 
       coalesce(BuildingName,'') 
     ) AS AddressLine1 
FROM MyTable 
UNION 
SELECT AddressId, 
     CONCAT(coalesce(BuildingName,''), ', ', 
       coalesce(SubBuildingName,''), ', ', 
       coalesce(BuildingNumber,'') 
     ) AS AddressLine1 
FROM MyTable 
UNION 
SELECT AddressId, 
     CONCAT(coalesce(BuildingName,''), ', ', 
       coalesce(BuildingNumber,''), ', ', 
       coalesce(SubBuildingName,'') 
     ) AS AddressLine1 
FROM MyTable 
+0

내가 위에서 언급했듯이, 내가 연합을 할 수 있다는 것을 안다. 그러나 위의 나의 예는 내가 UNION 루트를 사용하기를 원하지 않는 이유를 설명하기에는 너무 사소한 것이다. 예를 들어, 가능한 모든 순열을 생성하는 데 4 개의 열이 포함 된 경우 24 개의 조합을 직접 코딩해야합니다. 이것을 코딩하는 더 동적 인 방법이 없습니까? – RobW

+0

동적 SQL이 있습니다 ...매번 COLUMNS가 어떤 역할을하는지 어떻게 알 수 있습니까? – xQbert

+0

필자는 어떤 열이 관련되어 있는지 알고 있습니다 (4, 위의 예에서는 간단히 3 개만 제시했습니다). – RobW

관련 문제