【问题标题】:Left Join Pivot Table with Column from different Table左连接数据透视表与来自不同表的列
【发布时间】:2016-10-04 15:19:48
【问题描述】:

我已经成功地用这种格式的查询对表进行了透视:

数据透视表

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,其中包含returnColumnrule4 列。它看起来像这样:

+--------------+-------+
| 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

【问题讨论】:

标签: sql-server join pivot


【解决方案1】:

您的查询存在两个不同的问题。一个是简单的语法相关,并且已经在您的第一个查询中体现出来。第二个是使用什么连接类型的问题。您没有提供足够的信息来回答第二个问题。但是,您可以在我的A Join A Day 系列文章中找到有关不同联接类型以及何时使用的详细说明。

至于语法错误,我们先来看看pivot查询。这是一些测试数据设置:

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 Fiddle 当前已损坏,因此该链接可能无效。

简单的数据透视查询如下所示:

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,看看哪种类型适合你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2014-07-10
    • 2011-06-21
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多