SQL Union Query - PullRequest
       4

SQL Union Query

1 голос
/ 11 марта 2011
SELECT pv.PropertyID, COUNT(pv.VisitID) AS InitialVisit
FROM tblPAppointments pa INNER JOIN tblPropertyVisit pv ON pv.AppID = pa.AppID
WHERE pv.Status = 0
GROUP BY pv.PropertyID

UNION ALL

SELECT jv.PropertyID, COUNT(jv.JobVistID) AS JobVisit
FROM tblPAppointments pa INNER JOIN tblJobVisits jv ON jv.AppID = pa.AppID
WHERE jv.VisitStatus = 1
GROUP BY jv.PropertyID

Мне нужно получить значения InitialVisit и JobVisit в двух отдельных столбцах. Вышеупомянутый запрос возвращает только два столбца (PropertyID, InitialVisit).

Ответы [ 2 ]

4 голосов
/ 11 марта 2011

Используйте NULL в качестве заполнителя для столбца, для которого не будет никакого вывода:

  SELECT pv.PropertyID, 
         COUNT(pv.VisitID) AS InitialVisit,
         NULL AS jobvisit
    FROM tblPAppointments pa 
    JOIN tblPropertyVisit pv ON pv.AppID = pa.AppID
   WHERE pv.Status = 0
GROUP BY pv.PropertyID
UNION ALL
  SELECT jv.PropertyID, 
         NULL AS initialvisit,
         COUNT(jv.JobVistID) AS JobVisit
    FROM tblPAppointments pa 
    JOIN tblJobVisits jv ON jv.AppID = pa.AppID
   WHERE jv.VisitStatus = 1
GROUP BY jv.PropertyID

Это вернет три столбца.Псевдоним столбца необходим в первом запросе, но не во втором - я назначил псевдонимы обоим, чтобы прояснить, что происходит.

Имейте в виду, что использование NULL, как это в SQL Server, потребует от вас использования CAST / CONVERT для NULL для типов данных, отличных от INT, поскольку SQL Server по умолчанию принимает значение NULL для типа данных INT (как бы странно это ни было).

Альтернативный запрос, который не используетСОЮЗ:

   SELECT x.propertyid,
          COUNT(y.visitid) AS initialvisit,
          COUNT(z.jobvisitid) AS jobvisit
     FROM (SELECT pv.propertyid
             FROM TBLPROPERTYVISIT pv
            WHERE EXISTS (SELECT NULL
                            FROM TBLAPPOINTMENTS a 
                           WHERE a.appid = pv.appid)
           UNION 
           SELECT jv.propertyid
             FROM TBLJOBVISIT jv
            WHERE EXISTS (SELECT NULL
                            FROM TBLAPPOINTMENTS a 
                           WHERE a.appid = jv.appid)) x
LEFT JOIN TBLPROPERTYVISIT y ON y.propertyid = x.propertyid
LEFT JOIN TBLJOBVISIT z ON z.propertyid = x.propertyid
 GROUP BY x.propertyid
3 голосов
/ 11 марта 2011

Нет необходимости в объединении вообще. И вы тоже не используете tblPAppointments

Отредактировано, чтобы не допустить строк в одной из таблиц. Тем не менее, один вывод строки хотя

SELECT
    ISNULL(pv2.PropertyID, jv2.PropertyID),
    ISNULL(pv2.InitialVisit, 0),
    ISNULL(jv2.JobVisit, 0)
FROM
    (
    SELECT pv.PropertyID, COUNT(pv.VisitID) AS InitialVisit
    FROM tblPropertyVisit pv
    WHERE pv.Status = 0
    GROUP BY pv.PropertyID
    ) pv2
    FULL OUTER JOIN
    (
    SELECT jv.PropertyID, COUNT(jv.JobVistID) AS JobVisit
    FROM tblJobVisits jv
    WHERE jv.VisitStatus = 1
    GROUP BY jv.PropertyID
    ) jv2 ON pv2.PropertyID = jv2.PropertyID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...