对 Cross JOIN 进行分组 SQL

Grouping a Cross JOIN SQL

我正在尝试创建一个交叉连接,如下所示。 我的问题是我希望交叉连接由 Advisor 分组 目前我的查询 return this

 Advisor    Recieved    Advisor Issued
    104        5          104    10
    266        3          104    10
    104        5          266    8
    266        3          266    8

我想要return的是这个

Advisor Recieved Issued
  104      5      10
  266      3      8

这是我的代码

SELECT * FROM
(
SELECT p.Advisor,
Count(p.id) AS Recieved
 FROM BPS.dbo.tbl_Profile_Mortgage AS pm
JOIN dbo.tbl_Profile AS p
    ON p.ID = FK_ProfileId
WHERE 
p.CaseTypeID = '2' AND
p.Advisor IN ('266','104')  AND
  (MONTH(pm.DateAppRcvd) = MONTH(GETDATE())
      AND YEAR(pm.DateAppRcvd) = YEAR(GETDATE())) AND pm.DateCancelled IS NULL
GROUP BY p.Advisor
) AS t1

CROSS JOIN 

(
SELECT p.Advisor AS Advisor ,
Count(p.id) AS Issued

FROM BPS.dbo.tbl_Profile_Mortgage AS pm
JOIN dbo.tbl_Profile AS p
    ON p.ID = FK_ProfileId
WHERE 
p.CaseTypeID = '2' AND
p.Advisor IN ('266','104') AND
  (MONTH(pm.DateAppIssued) = MONTH(GETDATE())
      AND YEAR(pm.DateAppIssued) = YEAR(GETDATE())) AND pm.DateCancelled IS NULL
GROUP BY p.Advisor
) AS t2

任何帮助将不胜感激谢谢

将您的 CROSS JOIN 更改为 FULL OUTER JOIN 并在 Advisor 上加入您的两个子查询。

编辑 - 示例代码现在我不再使用手机了。

SELECT
    COALESCE(t1.Advisor , t2.Advisor)   AS Advisor,
    COALESCE(t1.Received, 0         )   AS Received,
    COALESCE(t2.Issued  , 0         )   AS Issued
FROM
(
    SELECT p.Advisor,
    Count(p.id) AS Recieved
     FROM BPS.dbo.tbl_Profile_Mortgage AS pm
    JOIN dbo.tbl_Profile AS p
        ON p.ID = FK_ProfileId
    WHERE 
    p.CaseTypeID = '2' AND
    p.Advisor IN ('266','104')  AND
      (MONTH(pm.DateAppRcvd) = MONTH(GETDATE())
          AND YEAR(pm.DateAppRcvd) = YEAR(GETDATE())) AND pm.DateCancelled IS NULL
    GROUP BY p.Advisor
)
    AS t1
FULL OUTER JOIN
(
    SELECT p.Advisor AS Advisor ,
    Count(p.id) AS Issued
    FROM BPS.dbo.tbl_Profile_Mortgage AS pm
    JOIN dbo.tbl_Profile AS p
        ON p.ID = FK_ProfileId
    WHERE 
    p.CaseTypeID = '2' AND
    p.Advisor IN ('266','104') AND
      (MONTH(pm.DateAppIssued) = MONTH(GETDATE())
          AND YEAR(pm.DateAppIssued) = YEAR(GETDATE())) AND pm.DateCancelled IS NULL
    GROUP BY p.Advisor
)
    AS t2
        ON t1.Advisor = t2.Advisor

编辑:单个查询中的另一个示例

SELECT
    p.Advisor,
    SUM(CASE WHEN pm.DateAppRcvd   >= DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) THEN 1 ELSE 0 END)   AS Recieved,
    SUM(CASE WHEN pm.DateAppIssued >= DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) THEN 1 ELSE 0 END)   AS Issued
FROM
    BPS.dbo.tbl_Profile_Mortgage AS pm
INNER JOIN
    dbo.tbl_Profile AS p
        ON p.ID = FK_ProfileId
WHERE 
        p.CaseTypeID = '2'
    AND p.Advisor IN ('266','104')
    AND pm.DateCancelled IS NULL
    AND (
            pm.DateAppRcvd   >= DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
        OR  pm.DateAppIssued >= DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
        )
GROUP BY
    p.Advisor

编辑:更简洁的查询

SELECT
    p.Advisor,
    SUM(CASE WHEN pm.DateAppRcvd   >= this_month.start THEN 1 ELSE 0 END)   AS Recieved,
    SUM(CASE WHEN pm.DateAppIssued >= this_month.start THEN 1 ELSE 0 END)   AS Issued
FROM
    BPS.dbo.tbl_Profile_Mortgage AS pm
INNER JOIN
    dbo.tbl_Profile AS p
        ON p.ID = FK_ProfileId
INNER JOIN
(
    SELECT DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) AS start
)
    AS this_month
        ON  pm.DateAppRcvd   >= this_month.start
        OR  pm.DateAppIssued >= this_month.start
WHERE 
        p.CaseTypeID = '2'
    AND p.Advisor IN ('266','104')
    AND pm.DateCancelled IS NULL
GROUP BY
    p.Advisor