2015-02-18 3 views
0

То, что я пытаюсь сделать, заключается в объединении двух операторов select (которые всегда должны иметь одинаковое количество строк и столбцов) рядом друг с другом вместо их объединения. То, что я пытался это union all:Выберите отчет Результаты Side by Side

SELECT Name,Price As 'Monday' FROM tbl_checktable WHERE (Type = 3042) And CloseDate = '2015-02-09' 
Union All 
SELECT Name,Price As 'Tuesday' FROM tbl_checktable WHERE (Type = 3042) And CloseDate = '2015-02-10' 

Но конечно я получить их в сочетании линейный

Name | Monday 

Name | Value 

Name | Value 

То, что я пытаюсь достичь этого

Name | Monday | Tuesday 

Name | Value | Value 

Edit: Как избежать результатов во вторник удаляется, когда нет соответствующего значения для понедельника?

SELECT m.Name, m.Price AS 'Monday', t.Price as 'Tuesday', w.Price as 'Wed' 
    FROM tbl_checktable m 
LEFT JOIN tbl_checktable t on m.name = t.name 
LEFT JOIN tbl_checktable w on m.name = w.name 
    WHERE (m.Type=3042) AND m.CloseDate ='2015-02-09' 
    AND (t.Type=3042) AND t.CloseDate='2015-02-10' 
    AND (w.Type=3042) AND w.CloseDate='2015-02-11' 
+1

Какие РСУБД платформы вы используете? –

+0

@GiorgosBetsos Sqlserver 2008, извините – clamchoda

ответ

1

Вы должны использовать JOIN вместо UNION.

SELECT m.Name, m.Price AS 'Monday', t.Price as 'Tuesday' 
    FROM tbl_checktable m OUTER JOIN tbl_checktable t on m.name = t.name 
    WHERE m.Type=3042 AND m.CloseDate ='2015-02-09' 
    AND t.Type=3042 AND t.CloseDate='2015-02-10'; 
+0

Почему этот ответ проголосовал ... кажется, именно то, что мне нужно? – clamchoda

+2

Я тоже ненавижу голосование без комментариев, так как я единственный человек, который ответил на этот вопрос, пожалуйста, не думайте, что нисходящий голос от меня. – jfun

+0

@ Даниэль Пожалуйста, см. Мое редактирование, как получилось, когда я добавляю на свадьбу, моих результатов больше нет? – clamchoda

0

просто использовать case заявление:

SELECT Name,case CloseDate 
when '2015-02-09' then Price else null end As Monday, 
case CloseDate 
when '2015-02-10' then Price else null end As Tuesday 
FROM tbl_checktable WHERE (Type = 3042) and CloseDate in ('2015-02-09','2015-02-10') 
+0

Амари «Ферхег». Это близко, как я могу остановить имя от показа дважды и просто один ряд? – clamchoda

+0

Это создает две строки, исходный запрос был для одной строки. – Daniel

+0

@ Даниэль Я не проголосовал за ваш ответ, но я думаю, что вы это сделали, так или иначе – jfun

2

Это трюк:

SELECT * 
FROM 
(
    SELECT Name, Price, DATENAME(WEEKDAY, CloseDate) as dayn 
    FROM tbl_checktable 
    WHERE [Type] = 3042 
    AND CloseDate IN ('02/16/2015', '02/17/2015') 
) d 
PIVOT 
(
    MAX(Price) for dayn IN (Monday, Tuesday) 
) piv; 

добавить среду, четверг и т.д. на основе ваших потребностей

+0

Предостережение. Это будет работать только после того, как у вас будет две или более даты, которые выпадают в тот же день. В этом случае будет собрано вместе. – shawnt00

4

Я думаю PIVOT лучше подходит для проблемы, которую вы пытаетесь решить:

SELECT Name, 
     [2015-02-09] AS Monday, [2015-02-10] AS Tuesday, [2015-02-11] AS Wednesday 
FROM (
    SELECT Name, Price, CloseDate 
    FROM tbl_checktable 
    WHERE Type = 3042) AS SourceTable 
PIVOT 
(
    AVG(Price) 
    FOR CloseDate IN ([2015-02-09], [2015-02-10], [2015-02-11]) 
) AS PivotTable; 

SQL Fiddle Demo here

+0

@Saba Как это работает, когда Name возвращает несколько значений? Когда я заменю ваш пример на 'a', 'b', 'c' вместо 'a', 'a', 'a', он возвращает только 2 строки, ожидается 3 – clamchoda

+0

@clamchoda Это неверно. Проверьте этот скрипт SQL: http://sqlfiddle.com/#!3/a1549/1 –

+0

А, я задавался вопросом, имел ли sql-сервер PIVOT. Я фактически не использовал sql-server * или * PIVOT в контексте SQL, но я знаю об этом из электронных таблиц. – Daniel

0

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

SELECT 
    min(case when m.CloseDate = '2015-02-09' then m.Price else null end) as Monday, 
    min(case when m.CloseDate = '2015-02-10' then t.Price else null end) as Tuesday, 
    min(case when m.CloseDate = '2015-02-11' then w.Price else null end) as Wednesday 
    FROM tbl_checktable m, tbl_checktable t, tbl_checktable w 
    WHERE 
     m.Type = 3042 AND m.CloseDate = '2015-02-09' 
    AND t.Type = 3042 AND t.CloseDate = '2015-02-10' 
    AND w.Type = 3042 AND w.CloseDate = '2015-02-11' 

Вы действительно не нужны эти объединения и мне интересно, и почему вы оставили присоединяется:

SELECT 
    min(case when m.CloseDate = '2015-02-09' then m.Price else null end) as Monday, 
    min(case when m.CloseDate = '2015-02-10' then m.Price else null end) as Tuesday, 
    min(case when m.CloseDate = '2015-02-11' then m.Price else null end) as Wednesday 
FROM tbl_checktable as m 
WHERE 
     m.Type = 3042 
    AND m.CloseDate IN ('2015-02-09', '2015-02-10', '2015-02-11') 
Смежные вопросы