对交叉连接SQL进行分组

对交叉连接SQL进行分组,sql,sql-server,join,cross-join,Sql,Sql Server,Join,Cross Join,我正在尝试创建一个交叉连接,如下所示。 我的问题是,我希望交叉联接由Advisor分组 当前我的查询返回此 Advisor Recieved Advisor Issued 104 5 104 10 266 3 104 10 104 5 266 8 266 3 266 8 我希望它能退回的是这个 Ad

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

 Advisor    Recieved    Advisor Issued
    104        5          104    10
    266        3          104    10
    104        5          266    8
    266        3          266    8
我希望它能退回的是这个

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

任何帮助都将不胜感激,谢谢

将您的
交叉联接
更改为
完全外部联接
,并在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
编辑:更整洁的查询

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

SQL Studio管理这不是一个DBMS,它是一个SQL客户机工具。但由于它只适用于Microsoft SQL Server,因此可以安全地假设您使用的是SQL Server。我非常喜欢单一查询。运行分配比完全外部联接更快。Cheers上次你写的查询非常干净谢谢我接受了你只是将日期设置为一个变量然后使用它的变量名调用该日期/很好地清理了查询。ThanksHey MatBailie如果我想添加日期作为参数,那么当用户运行我的报告时,他们会选择他们想要查询的月份。我该如何进行设置。@RustyHamster如果您提供参数,您甚至不需要本月的
联机视图。只需将参数放入条件中。还要记住包括上限和下限<代码>x>=@month\u start和x
或类似代码。