【问题标题】:SQL Server - Group by with multiple joins and stringsSQL Server - 使用多个连接和字符串分组
【发布时间】:2013-03-28 13:24:55
【问题描述】:

我已经搜索了许多类似的主题,但仍在努力使其发挥作用。我正在尝试对一列进行分组,特别是在进行了一些表连接之后。任何帮助将不胜感激

今天的输出

Account System  System  Plan Code   Account Plan Code   Request
12345   Sys1    Sys1    P1         12345    P1          00001
12345   Sys1    Sys1    P2         NULL     NULL        NULL
12345   Sys2    Sys2    P3         12345    P3          00002
34567   Sys1    Sys1    P1         NULL     NULL        NULL
34567   Sys1    Sys1    P2         34567    P2          00003
45678   Sys3    Sys3    P4         NULL     NULL        NULL

期望的输出

Account System  System  Plan Code   Account Plan Code   Request
12345   Sys1    Sys1    P1          12345   P1, P2      00001
12345   Sys2    Sys2    P3          12345   P3          00002
34567   Sys1    Sys1    P2          34567   P1,P2       00003
45678   Sys3    Sys3    P4          NULL    NULL        NULL

我要加入几张表,并且我想将计划代码合并到每个唯一帐户到系统映射的一行中。

  • Tab1 = 帐户和系统
  • Tab2 = 系统和计划代码(映射 显示与每个系统相关的计划代码)
  • Tab3 = 帐户、计划代码、请求编号

我迷失了 group by 我尝试了一列 GROUP BY 并得到不是 GROUP By Expression 的错误。因此,我包含了所有列,这根本不会改变输出。

SELECT      A.ACCOUNT, A.SYSTEM, B.SYSTEM, B.PCODE, C.ACCOUNT, C.PCODE, C.REQUEST
FROM        MYDB.TAB1 A
LEFT JOIN   MYDB.TAB2 B 
ON      A.SYSTEM = B.SYSTEM
LEFT JOIN   MYDB.TAB3 C
ON      A.ACCOUNT = C.ACCOUNT AND B.PCODE = C.PCODE
WHERE       A.ACCOUNT IS NOT NULL
ORDER BY    A.ACCOUNT

【问题讨论】:

  • 实际输出中的列数与显示的查询不匹配。您能否发布产生您的输出的实际查询?
  • 我将更新作为实际查询的输出,我刚刚手动输入了输出预览,只关注我关心的列,因为有些列是重复的。我现在会更新它,所以它很清楚。感谢观看
  • 这里的主要挑战是连接Plan Codes,因为MS SQL Server 没有GROUP_CONCAT 的直接类似物。其余的似乎微不足道。
  • 谢谢。我添加了完整的输出,这应该更清楚,抱歉我从一开始就没有。在输出中,我需要知道帐户是否有存档请求。只要我们有一个可接受的计划代码,就可以根据许多不同的可接受计划代码提交请求。我还关心给定帐户系统映射是否根本没有存档请求。

标签: sql join group-by concat


【解决方案1】:

如果您不需要连接计划,请查看以下GROUP BY 实现是否可以满足您的需求。我为此脚本删除了几列。为了遵守聚合查询限制,我在C.PCODE 周围使用了MAX(也可以是MIN)和MAX 用于C.REQUEST,这似乎是摆脱NULLs 的好选择。

SELECT      A.ACCOUNT, A.SYSTEM, MAX(C.PCODE), MAX(C.REQUEST)
FROM        MYDB.TAB1 A
LEFT JOIN   MYDB.TAB2 B 
ON      A.SYSTEM = B.SYSTEM
LEFT JOIN   MYDB.TAB3 C
ON      A.ACCOUNT = C.ACCOUNT AND B.PCODE = C.PCODE
WHERE       A.ACCOUNT IS NOT NULL
GROUP BY A.ACCOUNT, A.SYSTEM
ORDER BY    A.ACCOUNT

【讨论】:

  • 这似乎可以解决问题。感谢 PM 77-1 的帮助,这看起来可以满足我的核心需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 2010-12-04
相关资源
最近更新 更多