使用SWITCH()将列中的数据拆分为不同的列,并在到达行中包含关联的数据

时间:2014-04-26 13:43:55

标签: sql ms-access

我不太确定如何正确地说出问题,但我基本上是在尝试从此表开发一个SELECTs信息的SQL查询:

-------------------
| id | Val | Date |
|----|-----|------|
| 1  |  A  | 10/9 |
| 1  |  B  | 3/14 |
| 2  |  A  | 1/6  |
| 3  |  A  | 4/4  |
| 4  |  B  | 7/12 |
| 5  |  A  | 8/6  |
-------------------

并生成一个如下所示的表:

------------------------------------------------
| id | Val_1 | Val_1_Date | Val_2 | Val_2_Date |
|----|-------|------------|-------|-------------
| 1  |  A    |   10/9     |  B    |   3/14     |
| 2  |  A    |   1/6      |       |            |
| 3  |  A    |   4/4      |       |            |
| 4  |       |            |  B    |   7/12     |
| 5  |  A    |   8/6      |       |            |
------------------------------------------------

我已经开始并开发了查询,将Val字段中的值拉出到不同的列中:

SELECT * FROM 
(
  SELECT id, MAX(SWITCH( val='A', 'A')) as Val_1, 
             MAX(SWITCH( val='B', 'B')) as Val_2
  FROM table1 GROUP BY id
)a
WHERE Val_1 IS NULL OR Val_2 IS NULL;

我如何扩展它以提取相关日期?

(我使用的是SWITCH()而不是CASE WHEN,因为我使用的是类似于MS Access的驱动程序。)

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为以下应该有效:

select id, SWITCH( val='A', 'A') as Val_1, SWITCH( val='A', Date) as Val_1_Date, SWITCH( val='B', 'B') as Val_2, SWITCH( val='B', Date) as Val_2_Date FROM table1 GROUP BY id

答案 1 :(得分:0)

我不喜欢交换机,所以这里的查询可以在没有交换机的情况下执行您想要的操作。这也回答了你之前的问题。

Select distinct table1.ID, tableA.Val as Val_1, tableA.Date as Val_1_Date, 
     tableB.Val as Val_2, tableB.Date as Val_2_Date
FROM table1 left outer join 
     table1 as tableA on table1.id = tableA.id and tableA.Val = 'A' left outer join     
     table1 as tableB on table1.id = tableB.id and tableB.Val = 'B'

enter image description here

如果首选,您可以使用ISNULL。这是有效的,因为第一个表选择了一个不同的ID列,并且这两个连接获得了A和B值。使用此方法创建选择时,请确保在连接条件中使用tableA.Val = 'A',而不是在where子句中。在where子句中使用tableA.Val = 'A'将过滤掉所有NULL