2017-10-30 2 views
-2

sqlserver 테이블에있는 순 고객의 수를 가져 오는 일에 열중하고 있습니다. 데이터 저장 방법은 다음과 같습니다.덤프 데이터를 가져 오는 SQL

+----------+----------+----------+ 
| Value | Label | ClientID | 
+----------+----------+----------+ 
| Mr  | Title |  1 | 
| Sul  | Forename |  1 | 
| Last  | Surname |  1 | 
| WD17 6JJ | Postcode |  1 | 
+----------+----------+----------+ 

이제 forename, 성, 우편 번호를 기준으로 고유 고객을 나열해야합니다.

SELECT DISTINCT 
     id.clientID, 
     title.title, 
     Forename.Forename, 
     Surname.Surname, 
     Postcode.Postcode 
FROM table id 
CROSS APPLY (SELECT value AS title FROM table title WHERE label = 'title' AND title.clientID = id.clientID) title 
CROSS APPLY (SELECT value AS Forename FROM table Forename WHERE label = 'Forename' AND Forename.clientID = id.clientID) Forename 
CROSS APPLY (SELECT value AS Surname FROM table Surname WHERE label = 'Surname' AND Surname.clientID = id.clientID) Surname 
CROSS APPLY (SELECT value AS Postcode FROM table Postcode WHERE label = 'Postcode' AND Postcode.clientID = id.clientID) Postcode 

: 누군가가 당신이 뭔가를 할 수있는 별개의 고객

SELECT COUNT (DISTINCT ClientId) 
FROM dbo.table 

의 카운트

+0

예상 결과를하시기 바랍니다, 그리고 그 디자인은 무엇인가? – Sami

+0

고유 고객 수 또는 해당 고객 목록을 알고 싶습니다. 위의 결과 집합은 정보가 데이터베이스 테이블 (하나의 테이블)에 저장된 방법을 알려주는 것입니다 –

+0

어떤 성이 어느 forename에 속하는지 어떻게 알 수 있습니까? 고객 데이터 간의 링크는 무엇입니까? – VDK

답변

0

여기에 당신에게 원하는 결과를 줄 것이다 두 쿼리입니다

DECLARE @T table (Value varchar(255), Label varchar(255), ClientID int) 

INSERT INTO @T 
VALUES 
('Mr', 'Title', 1) 
, ('Sul', 'Forename', 1) 
, ('Last', 'Surname', 1) 
, ('WD17 6JJ', 'Postcode', 1) 
, ('Dr', 'Title', 2) -- different Title will be ignored 
, ('Sul', 'Forename', 2) 
, ('Last', 'Surname', 2) 
, ('WD17 6JJ', 'Postcode', 2) 
, ('Mr', 'Title', 3) 
, ('Sul2', 'Forename', 3) -- different Forename 
, ('Last', 'Surname', 3) 
, ('WD17 6JJ', 'Postcode', 3) 

-- Using JOIN 

SELECT DISTINCT 
    T1.Value Forename 
    , T2.Value Surname 
    , T3.Value Postcode 
FROM 
    @T T1 
    JOIN @T T2 ON T1.ClientID = T2.ClientID AND T2.Label = 'Surname' 
    JOIN @T T3 ON T1.ClientID = T3.ClientID AND T3.Label = 'Postcode' 
WHERE T1.Label = 'Forename' 

-- Using PIVOT 

SELECT DISTINCT 
    Forename 
    , Surname 
    , Postcode 
FROM 
    (
     SELECT 
      Value 
      , Label 
      , ClientID 
     FROM @T 
    ) T 
    PIVOT 
    (
     MAX (Value) 
     FOR Label IN 
      (
       Forename, Surname, Postcode 
      ) 
    ) P 
+0

거기에 이것을 실행하는 빠른 방법은 무엇입니까? 테이블에 350 만 행이 있습니다. –

+1

나는 더 잘 수행 할 수있는 대체 쿼리를 추가했습니다. 테이블 색인이 생성 되었습니까? –

0

도움이 아니면 별개의 목록을

DECLARE @Table TABLE ([Value] NVARCHAR(20), Label NVARCHAR(20), ClientID INT) 
INSERT INTO @Table 
([Value], Label, ClientID) 
VALUES 
(N'Mr', N'Title', 1), 
(N'Sul', N'Forename', 1), 
(N'Last', N'Surname', 1), 
(N'WD17 6JJ', N'Postcode', 1) 


SELECT Pvt.Forename 
    , Pvt.Surname 
    , Pvt.Postcode 
FROM @Table T 
PIVOT (MAX([Value]) FOR Label IN ([Title], [Forename], [Surname], [Postcode])) AS Pvt 
GROUP BY 
    Pvt.Forename 
    ,Pvt.Surname 
    ,Pvt.Postcode 
+0

주어진 테이블에서 해당 컬럼 (forename, surname, postcode)을 보았습니까? – Sami

+0

@Sami 좋은 지적, 바보 가정, 지금 수정하는 –

0

를 얻기 위해 피벗을 사용하시기 바랍니다 수 그것은 꽤 아니지만 작동해야합니다.

관련 문제