UNION in Stored Procedure COUNT - stored-procedures

I am creating a stored procedure which will return the results of open cases based on an entered time - i want to return the count of the cases but based on different offices. After editing my code i will also re-state my question different - which way is best to return a count instead of the actual results which i am getting now.
The Following is my stored procedure:
SELECT C.CaseId
FROM [Case] C
WHERE C.DateCreated <= #BeginDate
AND C.CaseId NOT IN (SELECT CaseId FROM CaseStatusChange CSC WHERE CSC.DateClosed < #BeginDate)
UNION
-- Also need the cases that reopened and are currently open
SELECT ReOpened.CaseId FROM
(
SELECT C.CaseId, MAX(CSC.DateReopened) AS DateReOpened
FROM [Case] C
INNER JOIN [CaseStatusChange] CSC ON C.CaseId = CSC.CaseId
WHERE CSC.DateReopened <= #BeginDate
GROUP BY C.CaseId
) ReOpened
WHERE ReOpened.CaseId NOT IN
(
SELECT CaseId FROM CaseStatusChange
WHERE CaseId = ReOpened.CaseId AND
CaseStatusChange.DateClosed BETWEEN ReOpened.DateReopened AND #BeginDate
)

It means that the number of columns in the SELECT lists must match. And their data types too.
Like this:
select
col1, col2, col3
from
t1
union
select
col1, col2, col3
from
t2
In your particular case, you need to add the OfficeID and the count in the second SELECT list.

Update: To Include OfficeId as requested:
SELECT OfficeId, SUM(CaseCount)
FROM (
SELECT COUNT(C.CaseId) AS CaseCount,
C.OfficeId
FROM [Case] C
WHERE C.DateCreated <= #BeginDate
AND C.CaseId NOT IN (SELECT CaseId FROM CaseStatusChange CSC WHERE CSC.DateClosed < #BeginDate)
GROUP BY C.OfficeId
UNION ALL
-- Also need the cases that reopened and are currently open
SELECT COUNT(ReOpened.CaseId) As CaseCount,
ReOpened.OfficeID
FROM
(
SELECT C.CaseId, MAX(CSC.DateReopened) AS DateReOpened, C.OfficeId
FROM [Case] C
INNER JOIN [CaseStatusChange] CSC ON C.CaseId = CSC.CaseId
WHERE CSC.DateReopened <= #BeginDate
GROUP BY C.CaseId, C.OfficeID
) ReOpened
WHERE ReOpened.CaseId NOT IN
(
SELECT CaseId FROM CaseStatusChange
WHERE CaseId = ReOpened.CaseId AND
CaseStatusChange.DateClosed BETWEEN ReOpened.DateReopened AND #BeginDate
)
GROUP BY OfficeID
) AS OpenCasesCount
GROUP BY OfficeId
You need to wrap your whole Query in an inner Query as shown below:
SELECT SUM(CaseCount)
FROM (
SELECT COUNT(C.CaseId) AS CaseCount
FROM [Case] C
WHERE C.DateCreated <= #BeginDate
AND C.CaseId NOT IN (SELECT CaseId FROM CaseStatusChange CSC WHERE CSC.DateClosed < #BeginDate)
UNION ALL
-- Also need the cases that reopened and are currently open
SELECT COUNT(ReOpened.CaseId) As CaseCount
FROM
(
SELECT C.CaseId, MAX(CSC.DateReopened) AS DateReOpened
FROM [Case] C
INNER JOIN [CaseStatusChange] CSC ON C.CaseId = CSC.CaseId
WHERE CSC.DateReopened <= #BeginDate
GROUP BY C.CaseId
) ReOpened
WHERE ReOpened.CaseId NOT IN
(
SELECT CaseId FROM CaseStatusChange
WHERE CaseId = ReOpened.CaseId AND
CaseStatusChange.DateClosed BETWEEN ReOpened.DateReopened AND #BeginDate
)
) AS OpenCasesCount

Related

Error while running hive join query

SELECT A.* , B.* FROM
(SELECT ID,DATE FROM APPLE) A
INNER JOIN
(SELECT ID,MAX(DATE) AS MAXDATE FROM APPLE GROUP BY ID) A1
ON A.ID = A.ID AND A.DATE = A1.MAXDATE
WHERE A.DATE > CURRENT_DATE
LEFT OUTER JOIN (
SELECT ID,NAME FROM BANANA) B
ON A.ID = B.ID
WHERE B.NAME IN ('USA','GBR') LIMIT 10;
Error: Error while compiling statement: FAILED: ParseException line
22:0 missing EOF at 'LEFT' near 'CURRENT_DATE'
(state=42000,code=40000)
Your problem is that you have a WHERE clause in the middle of your SQL statement. you can either move it into the nested query for A, or add it to the WHERE clause at the end. You also probably want to move the filtering on the B table inside the nested query, because you are essentially making the left join into an inner join by putting it in a WHERE clause at the end of the statement.
either
SELECT A.* , B.* FROM
(SELECT ID,DATE FROM APPLE WHERE DATE > CURRENT_DATE) A
INNER JOIN
(SELECT ID,MAX(DATE) AS MAXDATE FROM APPLE GROUP BY ID) A1
ON A.ID = A.ID AND A.DATE = A1.MAXDATE
LEFT OUTER JOIN (
SELECT ID,NAME FROM BANANA WHERE NAME IN ('USA','GBR') ) B
ON A.ID = B.ID
LIMIT 10;
or
SELECT A.* , B.* FROM
(SELECT ID,DATE FROM APPLE) A
INNER JOIN
(SELECT ID,MAX(DATE) AS MAXDATE FROM APPLE GROUP BY ID) A1
ON A.ID = A.ID AND A.DATE = A1.MAXDATE
LEFT OUTER JOIN (
SELECT ID,NAME FROM BANANA WHERE NAME IN ('USA','GBR') ) B
ON A.ID = B.ID
WHERE A.DATE > CURRENT_DATE
LIMIT 10;
The WHERE clause i.e. A.DATE > CURRENT_DATE should be inside the first select.Also note that you have a condition A.ID = A.ID and instead of A.ID = A1.ID
SELECT
A.* , B.*
FROM
(SELECT ID,DATE FROM APPLE WHERE DATE > CURRENTDATE) A
INNER JOIN
(SELECT ID,MAX(DATE) AS MAXDATE FROM APPLE GROUP BY ID) A1
ON
A.ID = A1.ID AND A1.DATE = A1.MAXDATE
LEFT OUTER JOIN
(SELECT ID,NAME FROM BANANA) B
ON
A.ID = B.ID
WHERE B.NAME IN ('USA','GBR') LIMIT 10;

Rewrite subquery with join

How would I go about rewriting the subquery below using join.
select name
from person p
where exists (select *
from friends r, person p2
where r.name1 = p.name and p2.name = r.name2 and p.address = p2.address)
select
p1.name
from
friends r
inner join person p1 on (p1.name=r.name1)
inner join person p2 on (p2.name=r.name2 and p2.address=p1.address)

Select rows where column A is not unique and column B is unique?

Suppose I have the following table:
MyTable
id INTEGER PRIMARY KEY
column_a TEXT
column_b TEXT
Now I want to return all rows where column_a is not unique, but where column_b is unique. So if I have the following data in the table:
id column_a column_b
1 A x
2 B x
3 A y
4 A x
5 B x
6 C z
I want the SQL statement to return this:
id column_a column_b
1 A x
3 A y
because column_a is the same in both rows but column_b differs. The rows with column_a="B" have the same value in column_b, so they should not be returned. And the row with column_a="C" has a unique column_a, so it shouldn't be returned either. How would I do that?
I've come half way by the following SQL:
SELECT *
FROM MyTable
JOIN
(
SELECT column_a, column_b
FROM MyTable
GROUP BY column_a
HAVING COUNT(*) >= 2
) TmpTable
ON MyTable.column_a = TmpTable2.column_a
WHERE MyTable.column_b != TmpTable.column_b
but that omits the last of the rows that I want to return, so in the above example it would only return
id column_a column_b
1 A x
SELECT MIN(id),
column_a,
column_b
FROM MyTable
WHERE column_a IN (SELECT column_a
FROM MyTable
GROUP BY column_a
HAVING COUNT(DISTINCT column_b) >= 2)
GROUP BY column_a,
column_b

uniqueidentifier is incompatible with int error

This is my Select statement in my stored procedure, i am trying to get all cases based on just the begin date as entered by the user. I keep getting ' uniqueidentifier is incompatible with int'. Not sure how to go about that.
(
SELECT COUNT(DISTINCT C.CaseID)
FROM [Case] C
INNER JOIN CaseOffice COD ON C.CaseId = COD.CaseId
INNER JOIN Office OD ON COD.OfficeId = OD.OfficeId
WHERE C.DateCreated <= #BeginDate AND OD.OfficeId = O.OfficeId
AND C.CaseId NOT IN
(
SELECT CaseId
FROM CaseStatusChange CSC
WHERE CSC.DateClosed < #BeginDate
)
UNION
SELECT ReOpened.CaseId FROM
(
SELECT C.CaseId, MAX(CSC.DateReopened) AS DateReOpened
FROM [Case] C
INNER JOIN [CaseStatusChange] CSC ON C.CaseId = CSC.CaseId
WHERE CSC.DateReopened <= #BeginDate
GROUP BY C.CaseId
) ReOpened
WHERE ReOpened.CaseId NOT IN -- Wasn't reopened and closed
(
SELECT CaseId FROM CaseStatusChange
WHERE CaseId = ReOpened.CaseId AND
CaseStatusChange.DateClosed BETWEEN ReOpened.DateReopened AND #BeginDate
)
)AS OpenBeginCases
CaseID is uniqueidentifier and you UNION this with COUNT(DISTINCT C.CaseID) which will be int
...
SELECT COUNT(DISTINCT C.CaseID) --int
...
UNION
...
SELECT ReOpened.CaseId --uniqueidentifier
...
So this error would be expected. Do you need the COUNT in the first clause?

nested select statement help

I am having trouble displaying the number of opencases that are found in my stored procedure, I am not sure if that select statement is placed properly.
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT
C.CaseNumber
, O.OfficeName
, CT.Description AS CaseType,
C.DateOpened AS DateOpened,
CR.Description AS Court
FROM
(
SELECT C.CaseId, O.OfficeId FROM [Case] C
INNER JOIN [Appointment] A ON C.CaseId = A.CaseId
INNER JOIN [Office] O ON A.OfficeId = O.OfficeId,
(
SELECT COUNT(DISTINCT CD.CaseId)
FROM [Case] CD
INNER JOIN CaseOffice COD ON CD.CaseId = COD.CaseId
INNER JOIN Office OD ON COD.OfficeId = OD.OfficeId
LEFT OUTER JOIN CaseStatusChange CSC ON CD.CaseId = CSC.CaseId
WHERE OD.OfficeId = O.OfficeId
AND
( CD.DateOpened BETWEEN #BeginDate AND #EndDate
OR
CSC.DateReopened BETWEEN #BeginDate AND #EndDate
)
)AS OpenCases
WHERE
-- Case was open (or reopened) during the date range
C.DateOpened BETWEEN #beginDate AND #endDate
OR
C.CaseId IN (SELECT CaseId FROM CaseStatusChange WHERE DateReopened BETWEEN #beginDate AND #endDate)
AND
-- Office had an appointment sometime during the date range
A.DateOn < #endDate AND (A.DateOff IS NULL OR A.DateOff BETWEEN #beginDate AND #endDate)
GROUP BY C.CaseId, O.OfficeId
)
CaseOfficeAppointment
INNER JOIN [Case] C ON CaseOfficeAppointment.CaseId = C.CaseId
INNER JOIN [Office] O ON CaseOfficeAppointment.OfficeId = O.OfficeId
INNER JOIN [CaseType] CT ON C.CaseTypeId = CT.CaseTypeId
INNER JOIN [Court] CR ON C.CourtId = CR.CourtId
OpenCases should occur before the Join statements as OpenCases is a data Column
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT
C.CaseNumber,
O.OfficeName,
CT.Description AS CaseType,
DATEADD(dd, 0, DATEDIFF(dd, 0, C.DateOpened)) AS DateOpened,
CR.Description AS Court,
CaseOfficeAppointment.OpenCases
FROM
(
SELECT C.CaseId, O.OfficeId,
(
SELECT COUNT(DISTINCT CD.CaseId)
FROM [Case] CD
INNER JOIN CaseOffice COD ON CD.CaseId = COD.CaseId
INNER JOIN Office OD ON COD.OfficeId = OD.OfficeId
LEFT OUTER JOIN CaseStatusChange CSC ON CD.CaseId = CSC.CaseId
WHERE OD.OfficeId = O.OfficeId
AND
( CD.DateOpened BETWEEN #BeginDate AND #EndDate
OR
CSC.DateReopened BETWEEN #BeginDate AND #EndDate
)
)AS OpenCases
FROM [Case] C
INNER JOIN [Appointment] A ON C.CaseId = A.CaseId
INNER JOIN [Office] O ON A.OfficeId = O.OfficeId
WHERE
-- Case was open (or reopened) during the date range
C.DateOpened BETWEEN #beginDate AND #endDate
OR
C.CaseId IN (SELECT CaseId FROM CaseStatusChange WHERE DateReopened BETWEEN #beginDate AND #endDate)
AND
-- Office had an appointment sometime during the date range
A.DateOn < #endDate AND (A.DateOff IS NULL OR A.DateOff BETWEEN #beginDate AND #endDate)
GROUP BY C.CaseId, O.OfficeId
)
CaseOfficeAppointment
INNER JOIN [Case] C ON CaseOfficeAppointment.CaseId = C.CaseId
INNER JOIN [Office] O ON CaseOfficeAppointment.OfficeId = O.OfficeId
INNER JOIN [CaseType] CT ON C.CaseTypeId = CT.CaseTypeId
INNER JOIN [Court] CR ON C.CourtId = CR.CourtId

Resources