2013-01-12 103 views
2

我的目標是計算並設置Entity表中的家庭名稱字段,用於由2人組成的所有家庭。我使用SQL Server 2012中,我必須與工作模式是:根據家庭記錄設置家庭名稱字段

CREATE TABLE Entity 
(
    EID INT, --PK 
    PID INT, --FK to Person.[Person ID] 
    HouseholdID VARCHAR(50), 
    HouseholdName VARCHAR(300) 
); 

CREATE TABLE Person 
(
    [Person ID] INT, 
    FirstName VARCHAR(30), 
    LastName VARCHAR(30) 
); 

INSERT INTO Entity VALUES (1,1,'HH1',NULL); 
INSERT INTO Entity VALUES (2,2,'HH1',NULL); 
INSERT INTO Entity VALUES (3,3,'HH2',NULL); 
INSERT INTO Entity VALUES (4,4,'HH2',NULL); 
INSERT INTO Entity VALUES (5,5,'HH3',NULL); 

INSERT INTO Person VALUES (1,'Jane', 'Doe'); 
INSERT INTO Person VALUES (2,'Joe', 'Doe'); 
INSERT INTO Person VALUES (3,'Sara', 'Dillin'); 
INSERT INTO Person VALUES (4,'Bill', 'Smith'); 
INSERT INTO Person VALUES (5,'Ted', 'Loner'); 

計算家喻戶曉的邏輯是這樣的: 如果兩個姓氏是這樣相同HouseholdID HH1的家喻戶曉的名字應該是'Jane & Joe Doe'。如果姓氏不同,比如在HH2它應該在格式「薩拉Dillin &比爾史密斯

我可以識別人,並讓他們爲了像這樣:

SELECT FirstName,LastName,HouseholdID 
FROM Entity e 
JOIN Person p ON p.[Person ID]=e.[PID] 
WHERE HouseholdID IN --HHs of 2 people 
(
    SELECT DISTINCT HouseholdID 
    FROM Entity e 
    JOIN Person p ON p.[Person ID]=e.[PID] 
    GROUP BY HouseholdID HAVING COUNT(*)=2 
) 
ORDER BY HouseholdID 

但我被困過去。從像C#這樣的過程語言,我知道如何解決這個問題,但速度很慢。我希望能夠以更快的SQL方式進行操作。

+0

+1 DDL和樣本數據。如果有更多人這樣做,這將是非常好的。 –

+0

您可以google [[連結行]](http://www.google.de/search?q=concatenate+rows+sql)。這就是你的問題所在。 – Nico

回答

1

對不起,我稍微更改了字段名稱以便於編碼。下面的查詢會得到你想要的東西:

SELECT 
    e1.HouseholdID, 
    CASE WHEN p2.LastName = p1.LastName THEN p1.FirstName + ' & ' + p2.FirstName + ' ' + p2.LastName 
     ELSE p1.FirstName + ' ' + p1.LastName + ' & ' + p2.FirstName + ' ' + p2.LastName END AS HouseholdName, 
    p1.FirstName, 
    p1.LastName, 
    p2.FirstName as p2FirstName, 
    p2.LastName as p2LastName 
FROM 
Person p1 
INNER JOIN Entity e1 ON 
    p1.id = e1.PID 
LEFT JOIN Entity e2 
    ON e1.HouseholdID = e2.HouseholdID AND e1.id < e2.id 
LEFT JOIN Person p2 
    ON e2.PID = p2.id 
WHERE e2.ID IS NOT NULL 
    AND NOT EXISTS 
    (SELECT * FROM Entity e3 
     WHERE e1.HouseholdID = e3.HouseholdID 
     AND NOT e3.id IN (e1.id, ISNULL(e2.id, 0)) 
    ) 

http://sqlfiddle.com/#!3/c8dd9/15

+0

我沒有想過多次加入同一張桌子。那會給我我需要的東西來使它工作。謝謝! – CHS