访问查询中的连接值

时间:2014-02-25 16:27:38

标签: sql ms-access ms-access-2007

我有一个查询,[Query1],包含员工姓名,项目,日期,月份和年份。

在另一个查询[Query2]中,我获取所有值并将它们放入交叉表中。我的行是“年,月,员工”。我的专栏是“Day”。我的价值观是项目。

问题是,对于一个日期,可能会有多个项目分配给员工。

当我尝试使用IIf(Count(*)>0,[Project],"")将项目作为值放入表中时,我收到错误,因为项目可能有多个可能的值,并且访问权限不知道选择哪一个。

如果有多个Project,我需要一种方法来连接值。

前:

[Query1]
Bill |  CC555  |  28  |  03  |  2014
Jim  |  CC999  |  29  |  03  |  2014
Jim  |  CC555  |  29  |  03  |  2014
John |  CC555  |  29  |  03  |  2014

[Query2]
Year  | Month | Employee | 1 | 2 | 3 | ... | 27 |  28   |      29       | 30 | 31 
2014  |  03   |   Bill   | - | - | - | ... | -  | CC555 |      -        | -  | -
2014  |  03   |   Jim    | - | - | - | ... | -  |   -   | CC555 + CC999 | -  | -
2014  |  03   |   John   | - | - | - | ... | -  |   -   |     CC555     | -  | -

除此之外:[Query1]是动态的,可能会删除或添加重复日期,因此[Query2]值必须相应更改。

2 个答案:

答案 0 :(得分:1)

一个简单的例子,你必须使它成为动态的,在实际场景中如果使用动态sql.i认为不需要动态,只需1到31的硬代码就不需要表变量和CTE

;With CTE as
(
select   'Bill' Employee ,'CC555' codes,28 dd,03 mm ,2014 yrs union all
select  'Jim ','CC999',  29 ,  03 ,  2014  union all
select  'Jim ','CC555',  29 ,  03 ,  2014  union all
select  'John','CC555',  29 ,  03 , 2014
)
select yrs,mm,Employee,isnull([28],'-')[28],[29],[30] from
(select Employee,dd,mm,yrs 
,stuff((select ','+codes from cte b where b.Employee=a.Employee for xml path('')),1,1,'')codes
from cte a ) src
pivot (min(codes) for dd in([28],[29],[30])) pvt

答案 1 :(得分:0)

通过使用此处给出的函数allenbrowne.com/func-concat.html,并按照此处给出的示例http://www.access-programmers.co.uk/forums/showthread.php?t=234291,我能够解决问题。