2016-10-04 3 views
0

Я успешно поворачиваются таблицу с помощью запроса этого формата:Соединение слева сводную таблицу с колонкой из другой таблицы

откидывании Таблица

SELECT returnColumn, ISNULL(rule1,0), ISNULL(rule2,0) 
FROM (SELECT DISTINCT returnColumn, 
         ruleColumn, 
         bool 
     FROM tableRules) AS st 

PIVOT (AVG(bool) FOR ruleColumn IN (rule1,rule2) As pt 

ORDER BY returnColumn 

Редактировать

Мой повернута стол имеет следующий формат:

+--------------+---------------------+ 
| returnColumn | rule1 rule2 rule3 | 
+--------------+---------------------+ 
| return1  | 0  1  0 | 
| return2  | 1  0  1 | 
+--------------+---------------------+ 

Существует еще одна таблица otherRuleTable с колонками returnColumn и rule4. Это выглядит следующим образом:

+--------------+-------+ 
| returnColumn | rule4 | 
+--------------+-------+ 
| return1  | 1 | 
| return2  | 1 | 
+--------------+-------+ 

Я хотел бы, чтобы это произошло:

+--------------+---------------------------+ 
| returnColumn | rule1 rule2 rule3 rule4| 
+--------------+---------------------------+ 
| return1  | 0  1  0  1 | 
| return2  | 1  0  1  1 | 
+--------------+---------------------------+ 

Покушение

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

(SELECT returnColumn, ISNULL(rule1,0), ISNULL(rule2,0) 
FROM (SELECT DISTINCT returnColumn, 
         ruleColumn, 
         bool 
     FROM tableRules) AS SourceTable 

PIVOT (AVG(bool) FOR ruleColumn IN (rule1,rule2) As pt) 
LEFT JOIN 
(SELECT rule4 FROM otherRuleTable ort) 
ON pt.returnColumn = ort.returnColumn 

ORDER BY returnColumn 

Как это сделать?

ОТВЕТ

SQL server join tables and pivot

+0

Вот отличное место для начала. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

ответ

0

Есть два отдельных вопроса с вашим запросом. один - это простой синтаксис, связанный и проявляющийся в вашем первом запросе. Второй вопрос - какой тип соединения использовать. Вы не предоставляете достаточно информации для второго вопроса, на который нужно ответить. Однако вы можете найти подробное объяснение различных типов соединений и когда использовать это в моей статье A Join A Day.

Что касается синтаксической ошибки, давайте сначала посмотрим на сводный запрос. Вот некоторые настройки тестовых данных:

SQL Fiddle

MS SQL Server 2014 Схема установки:

CREATE TABLE dbo.tableRules(
    returnColumn VARCHAR(10), 
    ruleColumn VARCHAR(10), 
    bool INT 
); 

CREATE TABLE dbo.otherRuleTable(
    returnColumn VARCHAR(10), 
    rule4 INT 
); 


INSERT INTO dbo.tableRules(returnColumn, ruleColumn, bool) 
VALUES 
    ('return1','rule1',0), 
    ('return1','rule2',1), 
    ('return1','rule3',0), 
    ('return2','rule1',1), 
    ('return2','rule2',1), 
    ('return2','rule3',0); 

INSERT INTO dbo.otherRuleTable(returnColumn, rule4) 
VALUES 
    ('return1',0), 
    ('return2',1); 

SQL Скрипки в настоящее время не работает, поэтому ссылка может не работать.

Простой стержень запроса выглядит следующим образом:

SELECT returnColumn, ISNULL(rule1,0) AS rule1, ISNULL(rule2,0) AS rule2, ISNULL(rule3,0) AS rule3 
    FROM 
    (
    SELECT DISTINCT returnColumn, ruleColumn, bool 
     FROM dbo.tableRules 
) AS SourceTable 
PIVOT 
(
    AVG(bool) 
    FOR ruleColumn IN (rule1,rule2,rule3) 
) As pt; 

Все, что было выключено в вашей версии была лишняя скобка.

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

SELECT * 
    FROM 
    (
    SELECT returnColumn, ISNULL(rule1,0) AS rule1, ISNULL(rule2,0) AS rule2, ISNULL(rule3,0) AS rule3 
     FROM 
     (
     SELECT DISTINCT returnColumn, ruleColumn, bool 
      FROM dbo.tableRules 
    ) AS SourceTable 
    PIVOT 
    (
     AVG(bool) 
     FOR ruleColumn IN (rule1,rule2,rule3) 
    ) As pt 
)pt2; 

с тем, что на месте, теперь вы можете присоединиться к нему, как будто это таблица:

 SELECT * 
     FROM 
     (
      SELECT returnColumn, ISNULL(rule1,0) AS rule1, ISNULL(rule2,0) AS rule2, ISNULL(rule3,0) AS rule3 
      FROM 
      (
       SELECT DISTINCT returnColumn, ruleColumn, bool 
       FROM dbo.tableRules 
      ) AS SourceTable 
      PIVOT 
      (
      AVG(bool) 
      FOR ruleColumn IN (rule1,rule2,rule3) 
      ) As pt 
     )pt2 
     JOIN dbo.otherRuleTable ort 
      ON ort.returnColumn = pt2.returnColumn; 

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