我不太确定如何正确地说出问题,但我基本上是在尝试从此表开发一个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的驱动程序。)
谢谢!
答案 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'
如果首选,您可以使用ISNULL
。这是有效的,因为第一个表选择了一个不同的ID列,并且这两个连接获得了A和B值。使用此方法创建选择时,请确保在连接条件中使用tableA.Val = 'A'
,而不是在where
子句中。在where子句中使用tableA.Val = 'A'
将过滤掉所有NULL
。