Я пытаюсь объединить два запроса следующим образом (псевдоним - одна из моих попыток решить проблему);
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-й столбец с соотношением и, возможно, другими вещами.
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
Если один запрос выбирает 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
Это ведет себя так, как ожидалось. Объединение не будет выполнять слияние полей, но даст вам комбинированный набор из n выборок.
Вместо этого вы можете рассмотреть возможность объединения
Используйте 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)
В чем необходимость 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
Похожие вопросы
Новые вопросы
sql-server
Microsoft SQL Server — это система управления реляционными базами данных (RDBMS). Используйте этот тег для всех выпусков Microsoft SQL Server, включая Compact, Express, Azure, Fast-track, APS (ранее PDW) и Azure SQL DW. Не используйте этот тег для других типов СУБД (MySQL, PostgreSQL, Oracle и т. д.). Не используйте этот тег для вопросов по программному обеспечению и разработке мобильных устройств, если только он не связан напрямую с базой данных.