Я пытаюсь объединить два запроса следующим образом (псевдоним - одна из моих попыток решить проблему);

SELECT a.Day, a.[Away Days], a.[Office Days] 
FROM (SELECT DATENAME(dw, Date) AS 'Day', SUM(Hours)/8 AS 'Away Days', NULL AS 'Office Days' 
    FROM  TimesheetDays 
    WHERE id_LineItem IN 
        (SELECT idLineItem FROM TimesheetLineItems 
        WHERE id_Timesheet IN 
            (SELECT idTimesheet 
            FROM Timesheets 
            WHERE id_User = 314) 
        AND id_Leave IS NOT NULL AND id_Leave != 4)
    AND Date < GETDATE()
    GROUP BY DATENAME(dw,Date)) a

UNION

SELECT b.Day, b.[Away Days], b.[Office Days] 
FROM (SELECT DATENAME(dw, Date) AS 'Day', NULL AS 'Away Days', SUM(Hours)/8 AS 'Office Days' 
    FROM TimesheetDays 
    WHERE id_LineItem IN 
        (SELECT idLineItem FROM TimesheetLineItems 
        WHERE id_Timesheet IN 
            (SELECT idTimesheet 
            FROM Timesheets 
            WHERE id_User = 314) 
        AND Offshore = 0 AND (id_Leave IS NULL OR id_Leave != 4))
    AND Date < GETDATE()
    GROUP BY DATENAME(dw,Date)) b

Проблема в том, что это неправильный союз. Мне интересно, может быть, именно часть Group By разрушает ситуацию, но я так не думаю?

Это примерный результат;

Day         Away Days   Office Days
Friday      NULL        23.0125
Friday      7           NULL
Monday      NULL        24
Monday      6           NULL
Thursday    NULL        26
Thursday    5.5         NULL
Tuesday     NULL        25.9375
Tuesday     7.5         NULL
Wednesday   NULL        26.05
Wednesday   8           NULL

Я ищу, чтобы оба значения находились в одной строке, а не имели NULL, и я не совсем уверен, почему это происходит (объяснение, а также решение были бы очень признательны).

Я хотел бы сохранить псевдонимы, так как я думаю, было бы неплохо добавить 4-й столбец с соотношением и, возможно, другими вещами.

0
Trent 16 Окт 2014 в 07:57

5 ответов

Лучший ответ

Вы можете объединить их и использовать ту же логику.

SELECT a.Day, ISNULL(a.[Away Days],b.[Away Days]) as [Away Days], ISNULL(a.[Office Days],b.[Office Days]) as [Office Days] 
FROM (SELECT DATENAME(dw, Date) AS 'Day', SUM(Hours)/8 AS 'Away Days', NULL AS 'Office Days' 
    FROM  TimesheetDays 
    WHERE id_LineItem IN 
        (SELECT idLineItem FROM TimesheetLineItems 
        WHERE id_Timesheet IN 
            (SELECT idTimesheet 
            FROM Timesheets 
            WHERE id_User = 314) 
        AND id_Leave IS NOT NULL AND id_Leave != 4)
    AND Date < GETDATE()
    GROUP BY DATENAME(dw,Date)) a

JOIN   (SELECT DATENAME(dw, Date) AS 'Day', NULL AS 'Away Days', SUM(Hours)/8 AS 'Office Days' 
    FROM TimesheetDays 
    WHERE id_LineItem IN 
        (SELECT idLineItem FROM TimesheetLineItems 
        WHERE id_Timesheet IN 
            (SELECT idTimesheet 
            FROM Timesheets 
            WHERE id_User = 314) 
        AND Offshore = 0 AND (id_Leave IS NULL OR id_Leave != 4))
    AND Date < GETDATE()
    GROUP BY DATENAME(dw,Date)) b ON a.Day = b.Day
1
Vinnie 16 Окт 2014 в 08:04

Если один запрос выбирает Away Days, другой Office Days, почему бы просто не СОЕДИНЯТЬ их, а не ОБЪЕДИНЯТЬ их? Напишите их как две производные таблицы и, возможно, свяжите их во внешнем запросе? Контур:

SELECT
  a.day,
  a.[Away Days],
  b.[Office Days]
FROM
  ( Q1 ) AS a
  INNER JOIN ( Q2 ) AS b ON
    a.day=b.day
0
TT. 16 Окт 2014 в 08:00

Это ведет себя так, как ожидалось. Объединение не будет выполнять слияние полей, но даст вам комбинированный набор из n выборок.

Вместо этого вы можете рассмотреть возможность объединения

0
TGH 16 Окт 2014 в 08:01

Используйте CASE, чтобы получить желаемый результат.

SELECT DATENAME(dw, Date) AS 'Day',
       (CASE WHEN (id_Leave IS NOT NULL AND id_Leave != 4) THEN SUM(Hours)/8
            ELSE NULL
       END)
        AS 'Away Days', 
       (CASE WHEN (Offshore = 0 AND (id_Leave IS NULL OR id_Leave != 4)) THEN SUM(Hours)/8
            ELSE NULL
       END)
       AS 'Office Days' 
    FROM TimesheetDays 
    WHERE id_LineItem IN 
        (SELECT idLineItem FROM TimesheetLineItems 
        WHERE id_Timesheet IN 
            (SELECT idTimesheet 
            FROM Timesheets 
            WHERE id_User = 314))
    AND Date < GETDATE()
    GROUP BY DATENAME(dw,Date)
0
Ram 16 Окт 2014 в 08:07

В чем необходимость UNOIN, проверьте запрос ниже и надеюсь, что это сработает для вас:

SELECT a.Day, a.[Away Days], a.[Office Days] 
FROM (SELECT DATENAME(dw, Date) AS 'Day', SUM(Hours)/8 AS 'Away Days', SUM(Hours)/8 AS 'Office Days' 
    FROM  TimesheetDays 
    WHERE id_LineItem IN 
        (SELECT idLineItem FROM TimesheetLineItems 
        WHERE id_Timesheet IN 
            (SELECT idTimesheet 
            FROM Timesheets 
            WHERE id_User = 314) AND Offshore = 0 
        AND id_Leave IS NOT NULL AND id_Leave != 4)
    AND Date < GETDATE()
    GROUP BY DATENAME(dw,Date)) a
0
Paresh J 16 Окт 2014 в 08:15