2016-08-09 5 views
2

Это сложный вопрос, поэтому, пожалуйста, несите меня. Поэтому у меня есть таблица ниже:SQL: показывать только значения в зависимости от содержимого

╔══════════╦═══════╦════════════╗ 
║ MasterID ║ SubID ║ Location ║ 
╠══════════╬═══════╬════════════╣ 
║  100 ║ 50 ║ California ║ 
║  100 ║ 45 ║ Texas  ║ 
║  100 ║ 40 ║ California ║ 
║  99 ║ 29 ║ California ║ 
║  99 ║ 28 ║ Texas  ║ 
║  99 ║ 28 ║ California ║ 
║  98 ║ 15 ║ Texas  ║ 
║  98 ║ 15 ║ Texas  ║ 
║  97 ║  5 ║ California ║ 
╚══════════╩═══════╩════════════╝ 

.

И я хочу показать каждый MasterID, SubID и местоположение, где находится Калифорния. Однако, вот улов. Я не хочу, чтобы эти вещи отображались, если в пределах каждого идентификатора MasterID у каждого SubID нет местоположения в Калифорнии.

Где MasterID = 100, я бы не хотел ничего отображаемого, потому что в этом MasterID есть Техас с его собственным SubID.

Где MasterID = 99, я бы хотел, чтобы все 3 столбца отображались, потому что, хотя есть техасский под этим MasterID, в пределах того же SubID есть Калифорния.

98 не хорошо, потому что у него есть SubIDs, которые содержат только Техас.

97 нормально, потому что это просто Калифорния.

Желаемый результат таблицы заключается в следующем:

╔══════════╦═══════╦════════════╗ 
║ MasterID ║ SubID ║ Location ║ 
╠══════════╬═══════╬════════════╣ 
║  99 ║ 29 ║ California ║ 
║  99 ║ 28 ║ Texas  ║ 
║  99 ║ 28 ║ California ║ 
║  97 ║  5 ║ California ║ 
╚══════════╩═══════╩════════════╝ 

(удаление 99 ...... 28 ..... Техас тоже хорошо)

+1

Итак, каков ваш вопрос? Что вы уже пробовали? – BWS

+0

Если я запустил его сейчас, например, я бы сказал «Выбрать из ... Где место LIKE« Калифорния ». Но тогда он будет показывать идентификаторы, которые я не хочу. В этом примере он будет показывать MasterID 100, SubID 50 и 40, в то же время скрывая там значение SubID 45 Texas. Если есть такой техасский SubID, я не хочу, чтобы какой-либо из этих столбцов отображался – sg4

ответ

3

Это должно сделать:

SELECT A.* 
FROM dbo.YourTable A 
INNER JOIN (SELECT MasterID, 
        COUNT(DISTINCT SubID) SubIDs, 
        COUNT(DISTINCT CASE WHEN Location = 'California' THEN SubID END) CaliforniaSubIDs 
      FROM dbo.YourTable 
      GROUP BY MasterID) B 
    ON A.MasterID = B.MasterID 
WHERE B.SubIDs = B.CaliforniaSubIDs; 

Here Вы можете видеть запрос в действии. И результаты:

╔══════════╦═══════╦════════════╗ 
║ MasterID ║ SubID ║ Location ║ 
╠══════════╬═══════╬════════════╣ 
║  97 ║  5 ║ California ║ 
║  99 ║ 29 ║ California ║ 
║  99 ║ 28 ║ Texas  ║ 
║  99 ║ 28 ║ California ║ 
╚══════════╩═══════╩════════════╝ 

UPDATE

Чтобы сделать то, что вы объяснили в свой комментарий, вы можете использовать:

WITH CTE AS 
(
    SELECT A.*, 
      RN = ROW_NUMBER() OVER(PARTITION BY MasterID, SubID 
            ORDER BY CASE WHEN Location LIKE '%Cali%' 
              OR Location LIKE '%fornia%' THEN 1 ELSE 2 END, 
              Location) 
    FROM dbo.YourTable A 
    INNER JOIN (SELECT MasterID, 
         COUNT(DISTINCT SubID) SubIDs, 
         COUNT(DISTINCT CASE WHEN Location = 'California' THEN SubID END) CaliforniaSubIDs 
       FROM dbo.YourTable 
       GROUP BY MasterID) B 
     ON A.MasterID = B.MasterID 
    WHERE B.SubIDs = B.CaliforniaSubIDs; 
) 
SELECT MasterID, SubID, Location 
FROM CTE 
WHERE RN = 1; 
+0

Это потрясающе, спасибо огромное! Я заметил, что из примерно 500 записей 2 из них были неправильно удалены, поэтому я рассмотрю это. Наверное, что-то я что-то испортил. В любом случае, спасибо еще раз! – sg4

+0

@ sg4 без проблем. Рад, что это сработало – Lamak

+0

Эй, я знаю, что прошло неделю, но у меня есть следующий вопрос ... Предположим, что под одним MasterID есть один SubID с несколькими местоположениями - есть ли способ показать только одно из этих мест? Еще лучше было бы установить предпочтения для отображения, например: Если местоположение содержит «Кали» или «форинью», покажите это, но если ни один из них не просто показывает Техас, это хорошо. Если вы знаете, как это сделать, я был бы очень благодарен, если бы вы снова помогли мне! – sg4