簡體   English   中英

SQL Server-替代包含聚合或子查詢的表達式的函數的替代方法

[英]SQL Server - Alternatives to aggregate functions for an expression containing an aggregate or subquery

首先,對於令人困惑的代碼示例感到抱歉,簡化我的問題非常棘手。

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個字段),該數字指示源3表中包含與聯接表的行匹配的行的次數(在此示例中,源1和2聯接在一起)。

每當源3的[CustID]字段等於源1的StaffID1或StaffID2字段且源3的[DoW]字段的星期幾與源1的AppDateTime字段的星期幾匹配時,此聯接就必須為。

substring(datename(dw,S1。[AppDateTime]),1,3)返回諸如“ Mon”,“ Tue”等之類的名稱。由於日期存儲為名稱(“ Thurs”,“ Wed”),因此使用之在來源3中。

我收到“無法對包含聚合或子查詢的表達式執行聚合功能”錯誤。 通常,為了解決這個問題,我會將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]條目都與星期幾匹配,因此它們都算在內。

您仍然可以將Source 3 LEFT JOIN移至Source 1和Source2。由於將工作日存儲為文本(而不是整數值),因此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 |
+------------+------------+-------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM