2009-10-08 2 views
0

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

Query 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 

Query 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 

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

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

+0

Как выглядит ваш код для объединения и какая ошибка дается? – RichardOD

+0

Я не хочу использовать union, потому что он объединяет эти данные в таблицу с тремя столбцами и делает записи трудно определить значения. – 2009-10-08 12:56:36

+0

Union не является правильным утверждением для этого запроса. Вам нужно рассматривать ваши два запроса как подзапросы, которые объединены вместе. Или, я уверен, желаемый запрос может быть записан как один запрос, так как два опубликованных вами очень похожи. – jnylen

ответ

1

OK ... что это один:

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

Объединение работает, но не возвращает данные в формате, который мне нужен, Год, Месяц, SameDay, Total. Он возвращается как Год1, месяце1, Sameday Год1, MONTH1, Total YEAR2, Month2, Sameday YEAR2, Month2, Total и т.д. – 2009-10-08 13:03:22

+0

О ... посмотрите на мой обновленный запрос ... – Scoregraphic

+0

Да! Отлично, это точно то, что я искал. – 2009-10-08 13:37:38

0

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

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

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

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

+0

Союз работает, но он не возвращает данные в том виде, в котором я пытаюсь достичь, в 4-х столбце. Союз объединяет все это в список из 3 столбцов. – 2009-10-08 13:06:21

+0

Союз не является правильным синтаксисом для этого запроса - он пытается объединить 2 подзапроса. – jnylen

1

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

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 
+0

Возвращает неправильные синтаксические ошибки: Msg 156, Level 15, State 1, Line 3 Неверный синтаксис рядом с ключевым словом 'IF'. Msg 102, Level 15, State 1, Line 3 Неверный синтаксис рядом с ','. – 2009-10-08 13:04:10

+0

Какой SQL-сервер? Это был код для MySQL. Для MS SQL Server используйте CASE: http://www.sql-server-performance.com/faq/iif_tsql_p1.aspx –

+0

SQL Server 2005, явно не сказал, что вместо этого просто помечал sql-сервер – 2009-10-08 13:14:04

0

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

SELECT -- query 1 

SELECT -- query 2 

Ваш клиент может затем прочитать 2 результат устанавливает самостоятельно - это зависит от LANGAUGE вы используете, но в 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

Чтобы создать отчет для распространения среди людей. Запрос Scoregraphic выше достигает того, что я хотел выполнить, 4 столбца из 2 3 запросов столбцов. – 2009-10-08 17:46:53

Смежные вопросы