【问题标题】:Merge two different rows into single row in SQL with different pattern将两个不同的行合并为具有不同模式的SQL中的单行
【发布时间】:2020-08-14 15:35:46
【问题描述】:

我正在尝试将多个相同类型的记录合并到 SQL 中的单行中。这是我的示例数据。我还尝试使用 COALESCE(Name + ',', '') AS Names,将它们合并在一起,然后在一个公用表中再次拆分它们。但是,这有点像合并第二行记录并在其上进行透视。

对此的任何意见都会有所帮助。谢谢!

Type| Name  | Department | Value1 |  Value 2 | Value 3 
-----------------------------------------------------
1  | John  |  A         |  100   |  NULL    |  NULL
1  | John  |  B         |   NULL |  200     |  NULL
1  | John  |  C         |  NULL  |  NULL    |  300
2  | Kay   |  A         |  400   |  NULL    |  NULL
2  | Kay   |  B         |  NULL  |  500     |  NULL
3  | Lor   |  B         |  NULL  |  600     |  NULL

Edited: Apologies for not properly articulating my original problem. Updated below again.
Here is the transformation output looking after the query. Given departments can be many and they are transformed to only 3 columns in the output based on Dept Type.

ID | Name  | Department1 | Department 2| Department 3 | Value1 |  Value 2 | Value 3 
-----------------------------------------------------
1  | John  |  A         |          B   |      C       |  100   |  200    |  300
2  | Kay   |  A         |          B   |      NULL    |  400   |  500    |  NULL
3  | Lor   |  NULL      |          B   |       NULL   |  NULL  |  600    |  NULL

I was trying with below query, but i am not able to transform department values into column values. 

SELECT 
   ID, 
   MAX(Value1) AS Value1, 
   MAX(Value2) AS Value2, 
   MAX(Value3) AS Value3 
FROM Employee
GROUP BY Name ```> 

【问题讨论】:

  • 顺便说一句,您的示例输出没有意义。部门 B 应该是部门 2,不是吗?
  • 是的,这是一个错字并更新了我的问题。感谢您的关注。

标签: sql-server merge


【解决方案1】:

你可以这样做:

SELECT 
   ID, 
   Name,
   Max(case when department = 'A' then 'A' end) as Department1,
   Max(case when department = 'B' then 'B' end) as Department2,
   Max(case when department = 'C' then 'C' end) as Department3,
   MAX(Value1) AS Value1, 
   MAX(Value2) AS Value2, 
   MAX(Value3) AS Value3 
FROM Employee
GROUP BY Id, Name;

认为它只是为了某种像显示这样的枢轴。

更新:我不太确定您的意思是否与您的示例中的一样(如果您的问题很清楚,那就太好了):

WITH
  x AS (
         SELECT
              Name, Department, DENSE_RANK() OVER (PARTITION BY Name ORDER BY Department) AS dept
         FROM Employee
       )
SELECT
         t.Type                                        AS ID
       , t.Name
       , MAX(CASE WHEN x.dept=1 THEN x.Department END) AS Department1
       , MAX(CASE WHEN x.dept=2 THEN x.Department END) AS Department2
       , MAX(CASE WHEN x.dept=3 THEN x.Department END) AS Department3
       , MAX(Value1)                                   AS Value1
       , MAX(Value2)                                   AS Value2
       , MAX(Value3)                                   AS Value3
FROM     Employee t
         INNER JOIN x ON x.Name=t.Name
GROUP BY t.Type, t.Name
ORDER BY t.Name;

DBFiddle demo is here

【讨论】:

  • 抱歉未能正确提供问题。我再次更新了问题。
  • 谢谢。您应用密集等级的第二个解决方案就像魅力一样!
  • @Born2Code,在我的回复中,第一个已经涵盖了更新的那个。第二个是如果您希望在原始输出中使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多