2016-08-23 20 views
1

這是很難形容我想的話所以這裏的表我處理基於在同一列

Persons 
First | Last | ID 
John | Smith | 1 
Jane | Smith | 2 

PerKey 
ID | KW | HITS 
1 | P.E. | 1 
1 | M E | 1 
1 | HVAC | 4 
2 | Acct | 7 

多種標準選擇單列我想要做的就是從人那裏選擇標準符合多行。

例如,我想知道誰有'體育' AND'M E'和'HVAC'。

在這種情況下,將返回約翰史密斯。

我已經能夠使用IN和HAVING子句完成此操作,但這限制了我無法過濾個人擁有KW和OR子句的次數。

說我只希望有人在'暖通空調'上有5次命中,這將理想地約翰史密斯。這裏的查詢我有個大氣壓:

SELECT first, last 
FROM persons 
LEFT JOIN perkey ON persons.id = perkey.id 
WHERE kw IN ('P.E.','M E','HVAC') 
GROUP BY first, last, persons.id 
HAVING COUNT(DISTINCT kw) = 3 

我使用SQL Server 2008。我無法改變的數據結構要麼因爲它是專有的。感謝您的任何幫助/建議。

+0

每個'id'對於每個'kw'都有一個單獨的行,而'hits'列是我想過濾掉的。即我想要一個HVAC'kw'和> 5的'hits'列。那有意義嗎? – shadowjfaith

回答

3

您可以使用條件聚集以選擇性地計算每個可能kw值:

SELECT first, last, 
     COUNT(CASE WHEN kw = 'P.E.' THEN 1 END) AS PE, 
     COUNT(CASE WHEN kw = 'M E' THEN 1 END) AS ME, 
     COUNT(CASE WHEN kw = 'HVAC' THEN 1 END) AS HVAC 
FROM persons 
LEFT JOIN perkey ON persons.id = perkey.id 
WHERE kw IN ('P.E.','M E','HVAC') 
GROUP BY first, last, persons.id 
HAVING COUNT(DISTINCT kw) = 3 

編輯:

如果您想根據,說來篩選記錄,HVAC那麼您可以在HAVING子句中添加條件聚合,例如:

SELECT first, last    
FROM persons 
LEFT JOIN perkey ON persons.id = perkey.id 
WHERE kw IN ('P.E.','M E','HVAC') 
GROUP BY first, last, persons.id 
HAVING COUNT(DISTINCT kw) = 3 AND 
     COUNT(CASE WHEN kw = 'HVAC' THEN 1 END) > 5 

EDIT2:

如果您想根據hits字段的值來篩選記錄,那麼你可以使用:

SELECT first, last    
FROM persons 
LEFT JOIN perkey ON persons.id = perkey.id 
WHERE kw IN ('P.E.','M E','HVAC') 
GROUP BY first, last, persons.id 
HAVING COUNT(DISTINCT kw) = 3 AND 
     COUNT(CASE WHEN hits > 4 THEN 1 END) > 0 
+0

語法不正確,您可以切換GROUP BY和HAVING子句嗎? –

+0

@RaduGheorghiu感謝您的評論。我只是從OP複製/粘貼查詢。 –

+0

@Matt好的,我編輯了我的答案。 –

2

有條件的分組應該工作,既要檢查各類千瓦,並限制或進一步檢查任何/所有類型的發生次數。像這樣:

SELECT persons.id, first, last, 
    SUM(CASE WHEN kw = 'P.E.' THEN 1 ELSE 0 END) AS PE, 
    SUM(CASE WHEN kw = 'M E' THEN 1 ELSE 0 END) AS ME, 
    SUM(CASE WHEN kw = 'HVAC' THEN 1 ELSE 0 END) AS HVAC 
FROM persons 
LEFT JOIN perkey ON persons.id = perkey.id 
WHERE kw IN ('P.E.','M E','HVAC') 
GROUP BY first, last, persons.id 
HAVING SUM(CASE WHEN kw = 'P.E.' THEN 1 ELSE 0 END) > 0 
AND SUM(CASE WHEN kw = 'M E' THEN 1 ELSE 0 END) > 0 
AND SUM(CASE WHEN kw = 'HVAC' THEN 1 ELSE 0 END) > 0 
+0

根據OP的聲明,「HVAC條件聚合應該= 5」說我只希望有人在'HVAC'有5次點擊「 – Matt

+0

是的,但這只是我採取的一個例子(」說我想...「)是一般情況。看到它適用於特定情況並不是一個很大的延伸。 – SlimsGhost