对 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
我正在尝试创建一个交叉连接,如下所示。 我的问题是我希望交叉连接由 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