2015-11-04 57 views
0

我无法使SQL查询的输出成为我希望的格式。现在,我有几个查询,我在哪里自行连接到一个表比较符合我的标准的帐户的记录。一个简单的例子看起来是这样的:在SQL Server 2012或Excel 2013中格式化结果

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来获得行顺序。

+0

这两个语句中的“ORDER BY”都会出现语法错误。 – Tom

+0

你说得对,我认为TOP子句阻止了这个错误,但它没有。我将编辑。 –

+0

所以我做了一个更接近代表我想用它的查询类型。我曾尝试将工会标准放在工会之外,但这不起作用。我唯一的选择是将我的整个查询放在from子句中,并使用一个联合体,我只选择顶部的'a'字段和底部的'b'字段?离开这个联盟,并且在联盟中的两个关键点都参与其中? – hbj