Слияние 2 SQL-запросов - PullRequest
0 голосов
/ 08 октября 2009

У меня есть 2 запроса, которые я хотел бы объединить в 1 набор результатов без использования объединения.

Запрос 1

select  datepart(yy,dateclosed)as 'Year',
    datepart(mm,dateclosed) as 'Month',
    count(*)as 'Total' 
from bug 
where projectid = 44 
and ifclosed = 1
and isnull(createdbyperson,1) <> '-1111111110'
and datepart(yy,dateclosed) > '2000'
group by datepart(yy,dateclosed), datepart(mm,dateclosed)
order by 1,2

Запрос 2

select  datepart(yy,dateclosed)as 'Year',
    datepart(mm,dateclosed) as 'Month',
    count(*)as 'SameDay' 
from bug 
where   projectid = 44 
        and ifclosed = 1
        and isnull(createdbyperson,1) <> '-1111111110'
        and datepart(yy,dateclosed) > '2000' 
        and CONVERT(VARCHAR(10), dateclosed, 101) = CONVERT(VARCHAR(10), datecreated, 101) 
group by datepart(yy,dateclosed),datepart(mm,dateclosed)
order by 1,2

Мне бы хотелось, чтобы возвращались значения года, месяца, одного дня, всего. Как мне этого добиться? Союз не делает то, что я хочу. Должен ли я сделать соединение и псевдоним таблицы? Subquery

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 08 октября 2009

Попробуйте это:

SELECT DATEPART(yy,dateclosed) AS 'Year',
    DATEPART(mm,dateclosed) AS 'Month',
    SUM(IF(CONVERT(VARCHAR(10), dateclosed, 101) = CONVERT(VARCHAR(10), datecreated, 101), 1, 0)) AS SameDay,
    COUNT(*) AS 'Total' 
FROM bug 
WHERE projectid = 44 
    AND ifclosed = 1
    AND ISNULL(createdbyperson,1) <> '-1111111110'
    AND DATEPART(yy,dateclosed) > '2000'
GROUP BY DATEPART(yy,dateclosed), DATEPART(mm,dateclosed)
ORDER BY 1,2
1 голос
/ 08 октября 2009

ОК ... как насчет этого:

select a.Year, a.Month, b.SameDay, a.Total
from
(
select  datepart(yy,dateclosed)as 'Year',
    datepart(mm,dateclosed) as 'Month',
    count(*)as 'Total' 
from bug 
where projectid = 44 
and ifclosed = 1
and isnull(createdbyperson,1) <> '-1111111110'
and datepart(yy,dateclosed) > '2000'
group by datepart(yy,dateclosed), datepart(mm,dateclosed)
) a
inner join
(
select  datepart(yy,dateclosed)as 'Year',
    datepart(mm,dateclosed) as 'Month',
    count(*)as 'SameDay' 
from bug 
where   projectid = 44 
        and ifclosed = 1
        and isnull(createdbyperson,1) <> '-1111111110'
        and datepart(yy,dateclosed) > '2000' 
        and CONVERT(VARCHAR(10), dateclosed, 101) = CONVERT(VARCHAR(10), datecreated, 101) 
group by datepart(yy,dateclosed),datepart(mm,dateclosed)
) b
on a.Year = b.Year AND a.Month = b.Month
order by 1,2
0 голосов
/ 08 октября 2009

Почему вы хотите это сделать? Знаете ли вы, что вы можете просто запросить несколько наборов результатов:

SELECT -- query 1

SELECT -- query 2

Ваш клиент может затем прочитать 2 набора результатов независимо - это зависит от используемого вами языка, но в C # с использованием SqlDataReader вы используете NextResult

SqlDataReader reader = GetReader();
while (reader.Read())
{
    // Process result of query 1
}
reader.NextResult();
while (reader.Read())
{
    // Process result of query 2
}
0 голосов
/ 08 октября 2009

Без использования объединения вы можете создать временную таблицу, записать в нее результаты двух запросов и затем запросить временную таблицу.

Я подозреваю, что вы должны не делать это, а понять, почему профсоюз не работает для вас.

Что вы пробовали?

Что случилось?

...