在SQL Server 2012或Excel 2013

时间:2015-11-04 14:14:09

标签: sql sql-server excel

我无法将SQL查询的输出格式化为我想要的格式。现在我有一些查询,我自己加入一个表来比较符合我标准的帐户的记录。一个简化的例子如下所示:

SELECT  a.Field1
       ,a.Field2
       ,a.Field3
       ,b.Field1
       ,b.Field2
       ,b.Field3
FROM Table1 a
JOIN Table1 b
    ON a.Field = b.Field

a和b的输出位于相同的行中,我想尝试将它们相互堆叠。有时会返回1000条记录。有没有一种简单的方法可以将b字段堆叠在相应的字段下面?经过一些研究后,我无法找到一种有效的方法来做到这一点,这不是完全手动和耗时的。

编辑:

我对第一篇文章中缺乏信息表示歉意。这可以更好地表示我的查询之一。

 SELECT DISTINCT a.ID
                ,a.Field1
                ,a.Field2
                ,a.Field3
                ,a.Field4
                ,a.Field5
                ,a.Field6
                ,b.ID
                ,b.Field1
                ,b.Field2
                ,b.Field3
                ,b.Field4
                ,b.Field5
                ,b.Field6               
  FROM Table1 a
  JOIN Table1 b
        ON a.somefield = b.somefield
        AND a.anotherfield = b.anotherfield
  WHERE a.ID > b.ID
  AND a.thisfield <> b.thisfield
  AND a.field1 = 'something'
  AND b.field1 = 'something'

鉴于某些领域不一定相等的标准是各种联合仍然是最合乎逻辑的方式?

1 个答案:

答案 0 :(得分:1)

  

是否有一种简单的方法可以将b字段堆放在正下方   对应一个字段?

SELECT
        Field1
       ,Field2
       ,Field3
FROM (
 SELECT 
        a.Field1
       ,a.Field2
       ,a.Field3
       ,a.Field
 FROM Table1 a
 UNION ALL
 SELECT 
        b.Field1
       ,b.Field2
       ,b.Field3
       ,b.Field
 FROM Table1 b
) t
ORDER BY Field ASC

编辑原始问题后编辑:

您确实需要使用UNION来获取所需的格式,但我会将您当前的查询作为CTE开始并使用从中绘制的UNION,如下所示:

WITH cte AS (
 SELECT DISTINCT a.ID      AS A_ID
                ,a.Field1  AS A_Field1
                ,a.Field2  AS A_Field2
                ,a.Field3  AS A_Field3
                ,a.Field4  AS A_Field4
                ,a.Field5  AS A_Field5
                ,a.Field6  AS A_Field6
                ,b.ID      AS B_ID
                ,b.Field1  AS B_Field1
                ,b.Field2  AS B_Field2
                ,b.Field3  AS B_Field3
                ,b.Field4  AS B_Field4
                ,b.Field5  AS B_Field5
                ,b.Field6  AS B_Field6
  FROM Table1 a
  JOIN Table1 b
        ON a.somefield = b.somefield
        AND a.anotherfield = b.anotherfield
  WHERE a.ID > b.ID
  AND a.thisfield <> b.thisfield
  AND a.field1 = 'something'
  AND b.field1 = 'something'
)
  SELECT
   A_ID
  ,B_ID
  ,A_Field1
  ,A_Field2
  ,A_Field3
  ,A_Field4
  ,A_Field5
  ,A_Field6
  FROM cte
  UNION ALL 
  SELECT
   A_ID
  ,B_ID
  ,B_Field1
  ,B_Field2
  ,B_Field3
  ,B_Field4
  ,B_Field5
  ,B_Field6
  FROM cte
  ORDER BY A_ID, B_ID

如果您必须在结果中将ID列叠加在一起,那么您需要将UNION放在派生表中,就像我在第一个示例中所做的那样。但是你需要在基础UNION查询中同时使用ID来获得行顺序。