Re: CASE в StoredProcedure
От: Warturtle  
Дата: 10.06.10 12:03
Оценка: 1 (1)
Здравствуйте, qqq0ppp, Вы писали:

Q>День добрый, подскажите начинающему


Q>Есть таблица, н/р:

Q>д1 д2 д3....(тип варчар)
Q>3 2
Q> б 3
Q>5 3

Q>мне нужно добыть сумму каждого столбца


Q>если просто бы были цифры — то тогда все ОК

Q>пишу
Q>...
Q>SELECT
Q>SUM(CAST(Round(D1,2)As decimal(5,2))) As D1
Q>FROM
Q>...

Q>но там есть и буквы, которые эквивалентны сумме=8

Q>тогда пишу
Q>...
Q>SELECT
Q>SumD2 =
Q>CASE D1
Q> WHEN 'б' then 8
Q> ELSE
Q> SUM(CAST(Round(D2,2)As decimal(5,2)))
Q>END
Q>FROM
Q>...
Q>и вот тебе подарок Column dbo.Zadanie.D2 is invalid in the select list because it is not contained in either an aggregate function or ORDER BY clause

Q>подскажите что я делаю не так??

Надо sum вытащить наружу,
-- так:
SELECT
    SUM(D2) AS SumD2
FROM 
    (
        SELECT
            D2 = CASE D1
                WHEN 'б' THEN 8
                ELSE CAST(ROUND(D2,2) AS DECIMAL(5,2))
            END
        FROM 
            X
    ) R
-- или так,
WITH R AS (
    SELECT
        D2 = CASE D1
            WHEN 'б' THEN 8
            ELSE CAST(ROUND(D2,2) AS DECIMAL(5,2))
        END
    FROM 
        X
)    
SELECT
    SUM(D2) AS SumD2
FROM 
    R
CASE в StoredProcedure
От: qqq0ppp  
Дата: 10.06.10 11:05
Оценка:
День добрый, подскажите начинающему

Есть таблица, н/р:
д1 д2 д3....(тип варчар)
3 2
б 3
5 3

мне нужно добыть сумму каждого столбца

если просто бы были цифры — то тогда все ОК
пишу
...
SELECT
SUM(CAST(Round(D1,2)As decimal(5,2))) As D1
FROM
...

но там есть и буквы, которые эквивалентны сумме=8
тогда пишу
...
SELECT
SumD2 =
CASE D1
WHEN 'б' then 8
ELSE
SUM(CAST(Round(D2,2)As decimal(5,2)))
END
FROM
...
и вот тебе подарок Column dbo.Zadanie.D2 is invalid in the select list because it is not contained in either an aggregate function or ORDER BY clause

подскажите что я делаю не так??
Re[2]: CASE в StoredProcedure
От: qqq0ppp  
Дата: 10.06.10 13:59
Оценка:
Большое спасибо за подсказку!!! )
все получилось так

SELECT
SUM(CASE D1
WHEN 'б' THEN 8
WHEN 'о' THEN 8
WHEN 'от' THEN 8
WHEN 'к' THEN 8
ELSE CAST(ROUND(D1,2) AS DECIMAL(5,2))
END) as SumD1
FROM dbo.PrZad
WHERE (StaffID = @StaffId) AND (MONTH(PlanDataOtch) = MONTH({ fn NOW() })) AND (YEAR(PlanDataOtch) = YEAR({ fn NOW() }))






Здравствуйте, Warturtle, Вы писали:

W>Здравствуйте, qqq0ppp, Вы писали:


Q>>День добрый, подскажите начинающему


Q>>Есть таблица, н/р:

Q>>д1 д2 д3....(тип варчар)
Q>>3 2
Q>> б 3
Q>>5 3

Q>>мне нужно добыть сумму каждого столбца


Q>>если просто бы были цифры — то тогда все ОК

Q>>пишу
Q>>...
Q>>SELECT
Q>>SUM(CAST(Round(D1,2)As decimal(5,2))) As D1
Q>>FROM
Q>>...

Q>>но там есть и буквы, которые эквивалентны сумме=8

Q>>тогда пишу
Q>>...
Q>>SELECT
Q>>SumD2 =
Q>>CASE D1
Q>> WHEN 'б' then 8
Q>> ELSE
Q>> SUM(CAST(Round(D2,2)As decimal(5,2)))
Q>>END
Q>>FROM
Q>>...
Q>>и вот тебе подарок Column dbo.Zadanie.D2 is invalid in the select list because it is not contained in either an aggregate function or ORDER BY clause

Q>>подскажите что я делаю не так??

W>Надо sum вытащить наружу,
W>
W>-- так:
W>SELECT
W>    SUM(D2) AS SumD2
W>FROM 
W>    (
W>        SELECT
W>            D2 = CASE D1
W>                WHEN 'б' THEN 8
W>                ELSE CAST(ROUND(D2,2) AS DECIMAL(5,2))
W>            END
W>        FROM 
W>            X
W>    ) R
W>-- или так,
W>WITH R AS (
W>    SELECT
W>        D2 = CASE D1
W>            WHEN 'б' THEN 8
W>            ELSE CAST(ROUND(D2,2) AS DECIMAL(5,2))
W>        END
W>    FROM 
W>        X
W>)    
W>SELECT
W>    SUM(D2) AS SumD2
W>FROM 
W>    R

W>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.