SQL Server добавляет запись записи вручную в представление - PullRequest
3 голосов
/ 14 февраля 2012

У меня есть представление, которое содержит данные, показанные на рисунке ниже. Представление показывает, сколько рабочих дней доступно в каждом месяце для текущего финансового года, исключая любые школьные / банковские каникулы.

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

Поскольку общее число доступных дней всегда будет равно нулю в августе, то представляется приемлемым жестко закодировать SQL, чтобы всегда иметь 0 для августа, а также запись апреля-августа, которая будет такой же, как и апрель-месяц. Июль.

Как лучше всего добавить эти 2 записи, и где в коде они должны быть размещены, см. Пример компоновки кода:

см. Ссылку (ответ на вопрос) для разметки кода:

Заполнение SQL всего рабочих дней в месяце за вычетом праздничных дней в текущем финансовом году

enter image description here

Ответы [ 2 ]

0 голосов
/ 28 марта 2012

Это даст вам желаемый набор результатов?

SELECT Period, DaysAvailable, Year FROM YOURVIEW
UNION ALL
SELECT DISTINCT 'April-August', DaysAvailable,  Year FROM YOURVIEW where Period = 'April-July'
UNION ALL
SELECT DISTINCT 'August', 0, YEAR FROM YOURVIEW
0 голосов
/ 14 февраля 2012

Для моего ответа я предполагаю, что у вас есть представление vDays со столбцами, которые соответствуют вашему снимку экрана: period, availabledays, year.

Чтобы добавить любые периоды нулевого дняк вашим результатам, независимо от того, какой месяц может иметь ноль (что соответствует августу и любому другому месяцу с нулевыми днями), вы можете расширить свое представление следующим образом:

WITH Mths (Mth) AS (
    SELECT 'January'
    UNION SELECT 'February'
    UNION SELECT 'March'
    UNION SELECT 'April'
    UNION SELECT 'May'
    UNION SELECT 'June'
    UNION SELECT 'July'
    UNION SELECT 'August'
    UNION SELECT 'September'
    UNION SELECT 'October'
    UNION SELECT 'November'
    UNION SELECT 'December'
    UNION SELECT 'April - January'
    UNION SELECT 'April - February'
    UNION SELECT 'April - March'
    UNION SELECT 'April - May'
    UNION SELECT 'April - June'
    UNION SELECT 'April - July'
    UNION SELECT 'April - August'
    UNION SELECT 'April - September'
    UNION SELECT 'April - October'
    UNION SELECT 'April - November'
    UNION SELECT 'April - December'

), Years (Year) AS (
    SELECT DISTINCT year
    FROM   vDays

), ZeroPeriods (Mth, Years) AS (
    SELECT Mth, Year
    FROM   Mths, Years

), JoinedData (Mth, AvailableDays, Year) AS (
    SELECT Mth, 0, Years
    FROM   ZeroPeriods
    UNION ALL
    SELECT period, availabledays, year
    FROM   vDays

), GroupedData (Mth, AvailableDays, Year) AS (
    SELECT Mth, SUM(AvailableDays), Year
    FROM JoinedData
    GROUP BY Mth, Year

)
SELECT * 
FROM   GroupedData
ORDER BY Year, CASE UPPER(LEFT(Mth, 3)) 
               WHEN 'JAN' THEN 1 WHEN 'FEB' THEN 2 WHEN 'MAR' THEN 3
               WHEN 'APR' THEN 4 WHEN 'MAY' THEN 5 WHEN 'JUN' THEN 6
               WHEN 'JUL' THEN 7 WHEN 'AUG' THEN 8 WHEN 'SEP' THEN 9
               WHEN 'OCT' THEN 10 WHEN 'NOV' THEN 11 ELSE 12 END;

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

...