powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Использование вычисляемых полей в SELECT
14 сообщений из 14, страница 1 из 1
Использование вычисляемых полей в SELECT
    #32809193
Leon.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Access XP, ADP + MS SQL SERVER 2000

При переводе запросов с Jet SQL --> Transact-SQL столкнулся с неприятной новостью. Если в Access MDB такой запрос допустим
Код: plaintext
1.
2.
3.
4.
SELECT	[Client],
	SUM([Load]) AS [SumLoad], SUM([Border]) AS [SumBorder], SUM([Upload]) AS [SumUpload],
	[SumLoad]+[SumBorder]+[SumUpload] AS [AllSum]
FROM	tblTable
GROUP BY [Client]
то на Transact-SQL так делать нельзя. QA пишет: "Invalid column name 'SumLoad'". Т.е. вычисляемые поля нельзя тут же использовать в SELECT.
Или все-таки можно? Подскажите, как?
...
Рейтинг: 0 / 0
Использование вычисляемых полей в SELECT
    #32809217
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT	[Client],
	SUM([Load]) AS [SumLoad],
	SUM([Border]) AS [SumBorder], 
	SUM([Upload]) AS [SumUpload],
	SUM([Load])+SUM([Border])+SUM([Upload]) AS [AllSum]
FROM	tblTable
GROUP BY [Client]
...
Рейтинг: 0 / 0
Использование вычисляемых полей в SELECT
    #32809236
Leon.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Bagin
Это понятно. Но возникает вопрос -- это что же, для вычисления 4 полей будет выполнятся 6 суммирований по таблице? К тому же я хотел использовать [AllSum] в этом же запросе дальше -- как его тогда использовать, тащить всю эту сумму?
...
Рейтинг: 0 / 0
Использование вычисляемых полей в SELECT
    #32809258
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таких случаях бывает удобно разбить один сложный запрос на цепочку простых. Каждый следующий использует поля, уже посчитанные в предыдущем и считает дальше.

А оптимизатор запросов все равно доберется до первоначальной таблице, то есть, мне кажется потерь по времени не будет.

Цепочку удобно именовать как <Имя запроса> + <номера 1, 2 .. >. В конце из них получается <Имя запроса>.
...
Рейтинг: 0 / 0
Использование вычисляемых полей в SELECT
    #32809262
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сколько мне известно, то SQL-сервер не будет проводить лишнее вычисление, т.е. будет оптимизировать при выполнении запроса. Но для написания запроса конечно неудобно. Не знаю как в на 2000 сервере, но на 6.5, если я не ошибаюсь, нельзя было использовать новые названия полей
...
Рейтинг: 0 / 0
Использование вычисляемых полей в SELECT
    #32809272
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист-ЛюбительЦепочку удобно именовать как <Имя запроса> + <номера 1, 2 .. >. В конце из них получается <Имя запроса>. Не совсем понятно, если не трудно, то приведите пожалуйста конкретный пример.
...
Рейтинг: 0 / 0
Использование вычисляемых полей в SELECT
    #32809277
Leon.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bagin Программист-ЛюбительЦепочку удобно именовать как <Имя запроса> + <номера 1, 2 .. >. В конце из них получается <Имя запроса>. Не совсем понятно, если не трудно, то приведите пожалуйста конкретный пример.Ага, я тоже что-то не понял совсем ;-)
...
Рейтинг: 0 / 0
Использование вычисляемых полей в SELECT
    #32809444
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не судьба узнать :-)
...
Рейтинг: 0 / 0
Использование вычисляемых полей в SELECT
    #32809459
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цепочка qrPaymentDetail1->qrPaymentDetail2->qrPaymentDetail

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
CREATE VIEW qrPaymentDetail1 AS

SELECT 

    det.iPaymentNomer, 
    det.iPaymentPartNomer, 
    prt.dtPaymentPartDate,
    det.iLANomer,
    det.iLASubNomer,
    sCurrencySymbol = CASE
        WHEN la.sCurrencySymbol = 'DEM' AND 
             prt.dtPaymentPartDate > CAST('2000/12/31' AS smalldatetime) 
        THEN 'EUR'
        ELSE la.sCurrencySymbol
    END,
    dbLAAmountMIO = CAST(
        CASE
            WHEN la.sCurrencySymbol = 'DEM' AND 
                 prt.dtPaymentPartDate > CAST('2000/12/31' AS smalldatetime) 
            THEN ROUND(la.dbLAamountMIO/ 1 . 95583 , 2 )
            ELSE la.dbLAAmountMIO
        END 
        AS NUMERIC( 6 , 2 )
    ),
    dbLAAmount = CAST(
        CASE
            WHEN la.sCurrencySymbol = 'DEM' AND 
                 prt.dtPaymentPartDate > CAST('2000/12/31' AS smalldatetime) 
            THEN ROUND(la.dbLAamount/ 1 . 95583 , 2 )
            ELSE la.dbLAAmount
        END 
        AS NUMERIC( 12 , 2 )
    ),

    sLAOriginalCurrencySymbol = la.sCurrencySymbol,
    dbLAOriginalAmountMIO = la.dbLAAmountMIO,
    dbLAOriginalAmount = la.dbLAAmount,

    la.dtLADate,
    la.sLAStatus,
    la.sLAType,
    sBankAgentOrCreditor,
    dbPrincipal, 
    pm.dbPaymentAmountUSDVal
    
FROM 

    tb_PAYMENT_Detail det
    INNER JOIN tb_PAYMENT_Part prt
        ON prt.iPaymentNomer = det.iPaymentNomer 
           AND prt.iPaymentPartNomer = det.iPaymentPartNomer
    INNER  JOIN tb_PAYMENT_Main pm
        ON pm.iPaymentNomer = det.iPaymentNomer
    INNER JOIN tb_PAYMENT_Loan la 
        ON det.iLANomer = la.iLANomer

CREATE VIEW qrPaymentDetail2 AS

SELECT 

    det1.*,
    dbRate_0 = cur0.dbCurrencyRateUSD,
    dbRate_1 = cur1.dbCurrencyRateUSD,
    dbRate_2 = ISNULL(cur2.dbRate_2, cur1.dbCurrencyRateUSD),
    dbPrincipalUSD = CAST(dbPrincipal/cur0.dbCurrencyRateUSD AS MONEY)

FROM 

    qrPaymentDetail1 det1
    INNER JOIN tb_PAYMENT_Currency cur0 
        ON  cur0.sCurrencySymbol   = det1.sCurrencySymbol
        AND cur0.iPaymentNomer     = det1.iPaymentNomer
        AND cur0.iPaymentPartNomer =  0 
    INNER JOIN tb_PAYMENT_Currency cur1 
        ON  cur1.sCurrencySymbol   = det1.sCurrencySymbol
        AND cur1.iPaymentNomer     = det1.iPaymentNomer
        AND cur1.iPaymentPartNomer = det1.iPaymentPartNomer
    LEFT JOIN tb_PAYMENT_LoanCurrency cur2 
        ON  cur2.sCurrencySymbol   = det1.sCurrencySymbol
        AND cur2.iPaymentNomer     = det1.iPaymentNomer
        AND cur2.iPaymentPartNomer = det1.iPaymentPartNomer
        AND cur2.iLANomer          = det1.iLANomer

CREATE VIEW qrPaymentDetail AS 

SELECT 

    det2.*, 
    sm.dbPrincipalUSDSum,
    dbPrincipalPercent = 
        CAST(det2.dbPrincipalUSD AS NUMERIC( 24 , 12 )) / 
        CAST(sm.dbPrincipalUSDSum AS NUMERIC( 24 , 12 )), 
    dbPaymentAmountUSD = CAST(
        CAST(det2.dbPaymentAmountUSDVal AS NUMERIC( 24 , 12 )) * 
        (
            CAST(det2.dbPrincipalUSD  AS NUMERIC( 24 , 12 )) / 
            CAST(sm.dbPrincipalUSDSum  AS NUMERIC( 24 , 12 ))
        )
    AS MONEY),
    dbPaymentAmount = CASE det2.iPaymentNomer 
        WHEN  1  THEN 
            CAST(
                ROUND(
                    (
                        CAST(det2.dbPaymentAmountUSDVal AS NUMERIC( 24 , 12 )) * 
                        (
                            CAST(det2.dbPrincipalUSD  AS NUMERIC( 24 , 12 )) / 
                            CAST(sm.dbPrincipalUSDSum  AS NUMERIC( 24 , 12 ))
                        )
                    ) * dbRate_2,
                     0 )
            AS MONEY)
        ELSE
            CAST(
                (
                    CAST(det2.dbPaymentAmountUSDVal AS NUMERIC( 24 , 12 )) * 
                    (
                        CAST(det2.dbPrincipalUSD  AS NUMERIC( 24 , 12 )) / 
                        CAST(sm.dbPrincipalUSDSum  AS NUMERIC( 24 , 12 ))
                    )
                ) * dbRate_2
            AS MONEY)
        END

FROM 

    qrPaymentDetail2 det2
    INNER JOIN sumPaymentUSD sm 
    ON sm.iPaymentNomer = det2.iPaymentNomer

...
Рейтинг: 0 / 0
Использование вычисляемых полей в SELECT
    #32809491
Bagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Программист-Любитель

Спасибо! :-)
...
Рейтинг: 0 / 0
Использование вычисляемых полей в SELECT
    #32809791
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Select
  [Client],
  [SumLoad],
  [SumBorder],
  [SumUpload],
  [AllSum] = [SumLoad] + [SumBorder] + [SumUpload]
From
(SELECT
  [Client],
  SUM([Load]) AS [SumLoad],
  SUM([Border]) AS [SumBorder],
  SUM([Upload]) AS [SumUpload]
FROM
  tblTable
GROUP BY
  [Client]
) as xxx

Или я опять опоздал?
...
Рейтинг: 0 / 0
Использование вычисляемых полей в SELECT
    #32809809
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На одну ступеньку вычислений выглядит хорошо. На две-три - уже хуже.
...
Рейтинг: 0 / 0
Использование вычисляемых полей в SELECT
    #32809868
Leon.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8-)
Спасибо всем ответившим. Но все это не то, сами понимаете. Хотелось бы запросто использовать вычисляемые поля в том же SELECTE, да Transact-SQL не разрешает.
...
Рейтинг: 0 / 0
Использование вычисляемых полей в SELECT
    #32809915
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Использование вычисляемых полей в SELECT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]