【问题标题】:Formatting results in SQL Server 2012 or Excel 2013在 SQL Server 2012 或 Excel 2013 中格式化结果
【发布时间】:2015-11-05 03:05:21
【问题描述】:

我无法将 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 字段堆叠在相应的 a 字段下方?经过一些研究,我无法找到一种不完全手动且耗时的有效方法。

编辑:

对于我的第一篇文章中缺乏信息,我深表歉意。这是对我的一个查询的更好表示。

 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'

考虑到某些字段不一定相等的标准,各种联合仍然是最合乎逻辑的方式吗?

【问题讨论】:

  • 能否添加示例数据和预期输出
  • 听起来你想要一个 UNION 而不是 JOIN。

标签: sql sql-server excel


【解决方案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 才能获得正确的行顺序。

【讨论】:

  • 两个语句中的“ORDER BY”都会出现语法错误。
  • 你说得对,我认为 TOP 子句阻止了该错误,但事实并非如此。我会编辑。
  • 所以我进行了更改以更准确地表示我想要使用它的查询类型。我曾尝试将 where 标准放在工会之外,但这不起作用。我唯一的选择是将整个查询放在 from 子句中并使用一个联合,我只在顶部选择“a”字段,在底部选择“b”字段吗?离开加入以及在工会中两者的标准在哪里?
  • 感谢您的意见
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多