1

私のクエリは、名前が「Anna」、「Szymkowiak」、およびこれと同じ「id」を持つ 2 人の人物を示していますが、これは同じ人物です。これをどのように合計できますか?例:id "80", "Anna", "Szymkowiak", "23", 2 -> 23 は 20 月に 3 を加えた合計で、2 は Aneks 1 に 1 を加えた合計です。

SELECT DISTINCT SBA.HRSystemId AS Id, SBA.FirstName,  SBA.Surname, 
    CASE WHEN SBA.EndDate < GETDATE() 
    THEN DATEDIFF(MONTH,SBA.StartDate,SBA.EndDate)
    ELSE DATEDIFF(MONTH,SBA.StartDate, GETDATE()) 
    END AS Miesiace_Przepracowane,
    MAX(SBC.ContractNumber) AS Aneks
    FROM SB_Applications SBA JOIN SB_Contracts SBC ON SBA.ApplicationId = SBC.ApplicationId 
    WHERE SBA.IsActiveYN = 1 AND SBA.HRSystemId != 0 AND SBC.ApplicationStatusId = 4
    GROUP BY SBA.FirstName, SBA.Surname,SBA.StartDate,SBA.EndDate,SBA.StartDate,SBA.HRSystemId,SBC.ContractNumber;

そして私はこれを得る:

id |FirstName|Surname|Miesiace_Przepracowane|Aneks
80, Anna, Szymkowiak, 20, 1
80, Anna, Szymkowiak, 3, 1
91, Jack, Sparrow, 2, 1
92, Tom, Jones, 1, 1
100, Rocky, Balboa, 3, 0

この例は機能しません ここに画像の説明を入力

助けてくれた同僚に感謝します。

4

2 に答える 2

1

すでに GROUP BY がある場合、DISTINCT を使用することはほとんどありません。それは無関係です。
最も自然で迅速な方法は、派生テーブルを使用してクエリを拡張することです。

SELECT HRSystemId, FirstName, SurName,
       Sum(Miesiace_Przepracowane) Miesiace_Przepracowane,
       MAX(Aneks) Aneks
FROM
(
    SELECT SBA.HRSystemId AS Id, SBA.FirstName,  SBA.Surname, 
        CASE WHEN SBA.EndDate < GETDATE() 
        THEN DATEDIFF(MONTH,SBA.StartDate,SBA.EndDate)
        ELSE DATEDIFF(MONTH,SBA.StartDate, GETDATE()) 
        END AS Miesiace_Przepracowane,
        MAX(SBC.ContractNumber) AS Aneks
        FROM SB_Applications SBA JOIN SB_Contracts SBC ON SBA.ApplicationId = SBC.ApplicationId 
        WHERE SBA.IsActiveYN = 1 AND SBA.HRSystemId != 0 AND SBC.ApplicationStatusId = 4
        GROUP BY SBA.FirstName, SBA.Surname,SBA.StartDate,SBA.EndDate,SBA.StartDate,SBA.HRSystemId,SBC.ContractNumber
) X
GROUP BY HRSystemId, FirstName, SurName;
于 2012-12-11T10:07:35.133 に答える
1
Select ID,FirstName,Surname,SUM(Miesiace_Przepracowane) as Miesiace_Przepracowane,SUM(Aneks) as Aneks from
(
SELECT DISTINCT SBA.HRSystemId AS Id, SBA.FirstName,  SBA.Surname, 
    CASE WHEN SBA.EndDate < GETDATE() 
    THEN DATEDIFF(MONTH,SBA.StartDate,SBA.EndDate)
    ELSE DATEDIFF(MONTH,SBA.StartDate, GETDATE()) 
    END AS Miesiace_Przepracowane,
    MAX(SBC.ContractNumber) AS Aneks
    FROM SB_Applications SBA JOIN SB_Contracts SBC ON SBA.ApplicationId = SBC.ApplicationId 
    WHERE SBA.IsActiveYN = 1 AND SBA.HRSystemId != 0 AND SBC.ApplicationStatusId = 4
    GROUP BY SBA.FirstName, SBA.Surname,SBA.StartDate,SBA.EndDate,SBA.StartDate,SBA.HRSystemId,SBC.ContractNumber;
) a
Group by  ID,FirstName,Surname  
于 2012-12-11T10:08:42.757 に答える