2016-08-29 3 views
0

у меня есть две таблицы, я хотел бы объединить и установить несколько условий, чтобы вытащить нужные данные: Таблица 1:.. [Folder1] [Имя] [Info]Объединение таблиц с несколькими условиями

|---------------------|------------------|------------------| 
|  NameID   |  Gender  |  DoB  | 
|---------------------|------------------|------------------| 
|   1   |   M  | 19800909  | 
|---------------------|------------------|------------------| 
|   2   |   M  | 19620102  | 
|---------------------|------------------|------------------| 
|   3   |   F  | 19501012  | 
|---------------------|------------------|------------------| 
|   4   |   F  | 19900212  | 
|---------------------|------------------|------------------| 
|   5   |   M  | 19501010  | 
|---------------------|------------------|------------------| 

А Таблица 2:.. [Folder1] [Body] [Вход]

|----------------|------------|------------|------------| 
|  NameID | BODYID | Category |  Result | 
|----------------|------------|------------|------------| 
|   1  | 80000001 | Height | 178  | 
|----------------|------------|------------|------------| 
|   1  | 80000002 | Waist | 32  | 
|----------------|------------|------------|------------| 
|   1  | 80000003 | weight | 78  | 
|----------------|------------|------------|------------| 
|   1  | 80000003 | weight | 85  | 
|----------------|------------|------------|------------| 
|   2  | 80000001 | height | 170  | 
|----------------|------------|------------|------------| 
|   2  | 80000002 | waist | 30  | 
|----------------|------------|------------|------------| 
|   2  | 80000003 | weight | 78  | 
|----------------|------------|------------|------------| 
|   2  | 80000003 | weight | 80  | 
|----------------|------------|------------|------------| 
|   2  | 80000003 | weight | 76  | 
|----------------|------------|------------|------------| 
|   3  | 80000001 | height | 168  | 
|----------------|------------|------------|------------| 
|   4  | 80000001 | height | 170  | 
|----------------|------------|------------|------------| 
|   5  | 80000001 | height | 171  | 
|----------------|------------|------------|------------| 

Я хочу, чтобы объединить 2 таблицы вместе с заданными условиями, так что комбинированный график будет иметь Top 50 NameID, Пол, DoB, BodyID, Категория, Результат людей с DoB до 19900101, показывая только данные о высоте и весе и показывая только персонажа с 3 или более весовыми данными.

текущий код SQL я прямо сейчас:

SELECT TOP 50 [Info].[NameID] 
,[Gender] 
,[DoB] 
,[BodyID] 
,[Category] 
,[Result] 
FROM [Folder1].[Name].[Info] LEFT JOIN [Folder1].[Body].[Sign] 
ON [Info].[NameID] = [Sign].[NameID] 
WHERE ([DoB] < '19900101') 
AND ([Category] = 'Weight' OR [Category] = 'Height') 
AND [Category] IN (SELECT Count(case when [BODYID] = 80000003 then 1 else null end) FROM [Folder1].[Body].[Sign] GROUP BY [Category] HAVING COUNT([BODYID]) >2) 
ORDER BY [NameID] 

Запрос может быть успешно выполнена, и таблица показывает вверх, но не появилось никакой информации. У меня такое ощущение, что что-то не так с этим разделом «счет», но не мог понять, что с ним не так.

То, что я надеюсь получить в результате что-то вроде:

|------------|------------|------------|------------|--------|--------| 
| NameID | Gender | DoB  |  BODYID |Category|Result | 
|------------|------------|------------|------------|--------|--------| 
|  2  | M   | 19620102 | 80000001 |Height | 170 | 
|------------|------------|------------|------------|--------|--------| 
|  2 | M   | 19620102 | 80000003 |Weight | 78 | 
|------------|------------|------------|------------|--------|--------| 
|  2 | M   | 19620102 | 80000003 |Weight | 80 | 
|------------|------------|------------|------------|--------|--------| 
|  2 | M   | 19620102 | 80000003 |Weight | 76 | 
|------------|------------|------------|------------|--------|--------| 

Спасибо заранее.

ответ

0

Я не уверен, что я следую за весь вопрос, но это, безусловно, выглядит не так:

AND [Category] IN (SELECT Count(case when [BODYID] = 80000003 then 1 else null end) 
        FROM [Folder1].[Body].[Sign] 
        GROUP BY [Category] 
        HAVING COUNT([BODYID]) > 3 
       ) 

Я не в полной мере следовать логике, но я мог себе представить, что вы хотите:

AND [Category] IN (SELECT [Category] 
        FROM [Folder1].[Body].[Sign] 
        GROUP BY [Category] 
        HAVING COUNT([BODYID]) > 3 
       ) 

или, возможно:

AND [Category] IN (SELECT [Category] 
        FROM [Folder1].[Body].[Sign] 
        GROUP BY [Category] 
        HAVING SUM(case when [BODYID] = 80000003 then 1 else 0 end) > 3 
       ) 
+0

Первый запрос не работает, запрос также возвращает данные людей, имеющих менее 3 весовых позиций. Второй запрос показывает таблицу, но в ней нет данных/информации. – Kaiser

+0

Извините за двусмысленность; Я добавил таблицу того, как я надеялся, что запрос может вернуться как. Я опробовал оба запроса, которые вы указали, но ни один из них не достиг результата. – Kaiser

0

похоже причине вы не могли бы получать результаты в becaus e у вас есть SELECT COUNT в вашем предложении where for. Код ниже показывает область проблем.

AND [Category] IN (SELECT Count(case when [BODYID] = 80000003 then 1 else null end) 
FROM [Folder1].[Body].[Sign] GROUP BY [Category] HAVING COUNT([BODYID]) >3) 

Проблема заключается в том, что вы сравниваете категорию, которая, как представляется, быть VARCHAR со счетчиком, который будет возвращать целочисленное значение. Поэтому, если подсчет подзапроса = 10, он не будет соответствовать ни одной из ваших категорий.

Скорее всего, вы не видите никаких результатов, потому что у вас нет категорий, равных подсчету вашего запроса.

1

Когда вы покинули соединение с таблицей, а затем вы положили условие для столбца, который существует внутри этой таблицы, вы фактически делаете внутреннее соединение, отбрасывая все строки из вывода, которые не удовлетворяют этому условию. Поскольку это левое соединение, условие присоединения может оцениваться как ложное, и все же вы выполняете другое условие в предложении WHERE, таким образом, что строка отбрасывается, так как она также вычисляется как false.

Я не буду следовать логике внутри вашего предложения WHERE, но я переместил одно условие в предложение JOIN и добавил скобки с OR [Category] IS NULL в «сложное» состояние, так что даже если LEFT JOIN не выполняется, и в этом случае [Category] будет NULL, он все еще возвращает строки на выходе.

SELECT TOP 50 [Info].[NameID] 
,[Gender] 
,[DoB] 
,[BodyID] 
,[Category] 
,[Result] 
FROM [Folder1].[Name].[Info] LEFT JOIN [Folder1].[Body].[Sign] 
ON [Info].[NameID] = [Sign].[NameID] AND [Sign].[Category] IN ('Weight', 'Height') 
WHERE [DoB] < '19900101' 
AND ([Category] IN (...) OR [Category] IS NULL) 
ORDER BY [NameID] 
+0

Я могу следовать логике с помощью части LEFT JOIN; но основная проблема заключается в том, чтобы установить условие с предложением WHERE, где я могу подсчитать количество записей веса и показать информацию людей с 3 или более весами. Но запросы просто не работают. – Kaiser

Смежные вопросы