首先对令人困惑的代码示例感到抱歉,简化我的问题证明很棘手。
select [...]
SUM(case when
(select [CustID] from [Source3] S3
where (S3.[CustID] = S1.[StaffID1] or S3.[CustID] = S1.[StaffID2])
and substring(datename(dw,S1.[AppDateTime]),1,3)=substring(S3.[DoW],1,3)) is not null
then 1 else 0 end), [...]
from [Source 1] S1
left join [Source 2] S2
on S2.[SbSpcID]=S1.[SbSpcID]
group by S1.[Condition1], S1.[Condition2]
基本上,我需要获取一个数字(作为该查询中的1个字段),该数字指示我的Source 3表包含与联接的表的行匹配的行的次数(在此示例中,Source 1和2联接在一起)。 / p>
只要源3的[CustID]字段等于源1的StaffID1或StaffID2字段且源3的[DoW]字段的星期几与AppDateTime字段的星期几匹配,就需要进行此联接来源1。
substring(datename(dw,S1。[AppDateTime]),1,3)返回诸如“ Mon”,“ Tue”等之类的名称。由于日期存储为名称(“ Thurs”,“星期三”)。
我收到“无法对包含聚合或子查询的表达式执行聚合函数”错误。通常,为了解决这个问题,我会将Source 3加入到包含Source 2和1的表中,但是因为我期望有多个匹配项,所以这意味着行数会增加,这会破坏该查询的其他结果(当前工作正常)。
...
..
。
帮助!我的脑痛。
---------------------编辑:---------------------
样本数据:
源1&2:
[Condition1] [Condition2] [SbSpcID] [StaffID1] [StaffID2] [AppDateTime]
Hosp Doc xxx Con123 NULL 2018-02-10 16:00
Hosp Nur xxx NULL Con123 2018-03-15 21:05
Clin Doc xxx Con125 NULL 2018-04-12 18:30
Hosp DIT xxx NULL NULL 2018-02-25 16:01
Hosp Reg xxx NULL Con126 2018-06-30 09:45
Hosp Doc xxx Con321 NULL 2018-03-11 11:55
Hosp Nur xxx NULL Con125 2018-01-01 06:29
Hosp Doc xxx Con125 NULL 2018-02-01 17:00
来源3:
[CustID] [Dow]
Con123 Wed
Con123 Thurs
Con123 Fri
Con123 Sunday
Con125 Mon
Con125 Tues
Con126 Sat
Con321 Mon
结果:
[Condition1] [Condition2] [Query]
Hosp Doc 0
Hosp Nur 2
Clin Doc 0
Hosp DIT 0
Hosp Reg 1
尽管[Hosp] [Doc]条目很多,但与Source 3中的星期几不匹配。而[Hosp] [Nur]条目都与星期几匹配,因此它们计数。
答案 0 :(得分:0)
您仍然可以{3}到源1和2。LEFT JOIN
您的联接将很奇怪且效率低下,因为您将工作日存储为文本,而不是它们的整数值。
使用您的示例数据(我将来源1和来源2合并为1个CTE):
-- sample data
WITH
Source_1_2(Condition1, Condition2, StaffID1, StaffID2, AppDateTime)
AS
(
SELECT * FROM
(
VALUES
('Hosp', 'Doc', 'Con123', NULL, '2018-02-10 16:00'),
('Hosp', 'Nur', NULL, 'Con123', '2018-03-15 21:05'),
('Clin', 'Doc', 'Con125', NULL, '2018-04-12 18:30'),
('Hosp', 'DIT', NULL, NULL, '2018-02-25 16:01'),
('Hosp', 'Reg', NULL, 'Con126', '2018-06-30 09:45'),
('Hosp', 'Doc', 'Con321', NULL, '2018-03-11 11:55'),
('Hosp', 'Nur', NULL, 'Con125', '2018-01-01 06:29'),
('Hosp', 'Doc', 'Con125', NULL, '2018-02-01 17:00')
) v(c1, c2, c3, c4, c5)
)
,Source_3(CustID, Dow) AS
(
SELECT * FROM
(
VALUES
('Con123', 'Wed'),
('Con123', 'Thurs'),
('Con123', 'Fri'),
('Con123', 'Sunday'),
('Con125', 'Mon'),
('Con125', 'Tues'),
('Con126', 'Sat'),
('Con321', 'Mon')
) v(c1, c2)
)
-- actual query
SELECT
Source_1_2.Condition1,
Source_1_2.Condition2,
COUNT(Source_3.CustID) AS [Count]
FROM Source_1_2
LEFT JOIN Source_3 ON
(Source_3.CustID = Source_1_2.StaffID1 OR Source_3.CustID = Source_1_2.StaffID2)
AND LEFT(Source_3.Dow, 3) = LEFT(DATENAME(WEEKDAY, Source_1_2.AppDateTime), 3)
GROUP BY
Source_1_2.Condition1,
Source_1_2.Condition2
为您提供此结果:
+------------+------------+-------+
| Condition1 | Condition2 | Count |
+------------+------------+-------+
| Hosp | DIT | 0 |
| Clin | Doc | 0 |
| Hosp | Doc | 0 |
| Hosp | Nur | 2 |
| Hosp | Reg | 1 |
+------------+------------+-------+