2017-03-16 81 views
1

我是新来的Stackoverflow所以。希望我的问题不是愚蠢的!MSSQL-结合两个选择,包括JOIN和COUNT

我有两个选择,我必须合并。我试过联盟和另一个联盟,但它没有解决。

SELECT 
Person.Name, Saldo1.Duration AS Holiday, Saldo2.Duraten AS Hours 
FROM Person_Saldo AS Saldo1 
JOIN Person_Saldo AS Saldo2 ON Saldo1.Person_ID = Saldo2.Person_ID 
JOIN Person ON Saldo1.Person_ID = Person.ID 
WHERE Person.Group_ID= '1' AND Person.Active = 'true' AND Saldo1.Year = '2017' AND Saldo1.Timekonto = '4' AND Saldo2.Timekonto='52' 

而第二选择:

SELECT 
Person_ID, Count([Date]) AS Amount 
FROM Booking Where Timekonto = 54 AND Booking_OK = 1 Group by Person_ID 

第一个SELECT显示是这样的:

Name Holiday Hours A 20 50 B 12 -30

第二是这样的:

ID Amount A 4 B 3

我尝试什么:
Name Holiday Hours Amount A 20 50 4 B 12 -30 3

谢谢,希望你能帮助我。

回答

1

一种方法是加入您的聚集查询到你的主查询,如下所示:

SELECT 
    Person.Name 
    , Saldo1.Duration AS Holiday 
    , Saldo2.Duraten AS Hours 
    , b.Amount 
FROM Person_Saldo AS Saldo1 
JOIN Person_Saldo AS Saldo2 ON Saldo1.Person_ID = Saldo2.Person_ID 
JOIN Person ON Saldo1.Person_ID = Person.ID 
left join (
    SELECT Person_ID, Count([Date]) AS Amount 
    FROM Booking 
    Where Timekonto = 54 
    AND Booking_OK = 1 
    Group by Person_ID 
) b on b.Person_ID = Saldo1 
WHERE Person.Group_ID= '1' 
    AND Person.Active = 'true' 
    AND Saldo1.Year = '2017' 
    AND Saldo1.Timekonto = '4' 
    AND Saldo2.Timekonto='52' 

您可能需要使用一个left join代替inner join的,如果count()可能null为您还是想一个人返回结果。

您也可以使用outer apply()cross apply()获得相同的结果。

SELECT 
    Person.Name 
    , Saldo1.Duration AS Holiday 
    , Saldo2.Duraten AS Hours 
    , b.Amount 
FROM Person_Saldo AS Saldo1 
JOIN Person_Saldo AS Saldo2 ON Saldo1.Person_ID = Saldo2.Person_ID 
JOIN Person ON Saldo1.Person_ID = Person.ID 
outer apply (
    SELECT Count([Date]) AS Amount 
    FROM Booking as i 
    Where i.Person_Id = Saldo1.PersonId 
    AND i.Timekonto = 54 
    AND i.Booking_OK = 1 
) as b 
WHERE Person.Group_ID= '1' 
    AND Person.Active = 'true' 
    AND Saldo1.Year = '2017' 
    AND Saldo1.Timekonto = '4' 
    AND Saldo2.Timekonto='52' 
+0

谢谢,这真的帮了我很多! – mhuber

+0

@mhuber乐意帮忙! – SqlZim

0

您可以使用“With”以使其更清晰。您可以使用两个表之间的左外连接。

WITH Table2 as (
    SELECT 
    Person_ID, Count([Date]) AS Amount 
    FROM Booking Where Timekonto = 54 AND Booking_OK = 1 Group by Person_ID) 


Select Name, Holiday, Hours, Amount 
from (SELECT 
    Person.Name, Saldo1.Duration AS Holiday, Saldo2.Duraten AS Hours 
    FROM Person_Saldo AS Saldo1 
    JOIN Person_Saldo AS Saldo2 ON Saldo1.Person_ID = Saldo2.Person_ID 
    JOIN Person ON Saldo1.Person_ID = Person.ID 
    WHERE Person.Group_ID= '1' AND Person.Active = 'true' 
    AND Saldo1.Year = '2017' AND Saldo1.Timekonto = '4' 
    AND Saldo2.Timekonto='52') Table1 LEFT OUTER JOIN 
    Table2 on Table2.Person_ID=Table1.Name