Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Использование вычисляемых полей в SELECT / 14 сообщений из 14, страница 1 из 1
02.12.2004, 11:54:08
    #32809193
Leon.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
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
02.12.2004, 12:00:08
    #32809217
Bagin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
Код: 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
02.12.2004, 12:04:42
    #32809236
Leon.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
to Bagin
Это понятно. Но возникает вопрос -- это что же, для вычисления 4 полей будет выполнятся 6 суммирований по таблице? К тому же я хотел использовать [AllSum] в этом же запросе дальше -- как его тогда использовать, тащить всю эту сумму?
...
Рейтинг: 0 / 0
02.12.2004, 12:11:48
    #32809258
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
В таких случаях бывает удобно разбить один сложный запрос на цепочку простых. Каждый следующий использует поля, уже посчитанные в предыдущем и считает дальше.

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

Цепочку удобно именовать как <Имя запроса> + <номера 1, 2 .. >. В конце из них получается <Имя запроса>.
...
Рейтинг: 0 / 0
02.12.2004, 12:12:54
    #32809262
Bagin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
На сколько мне известно, то SQL-сервер не будет проводить лишнее вычисление, т.е. будет оптимизировать при выполнении запроса. Но для написания запроса конечно неудобно. Не знаю как в на 2000 сервере, но на 6.5, если я не ошибаюсь, нельзя было использовать новые названия полей
...
Рейтинг: 0 / 0
02.12.2004, 12:16:26
    #32809272
Bagin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
Программист-ЛюбительЦепочку удобно именовать как <Имя запроса> + <номера 1, 2 .. >. В конце из них получается <Имя запроса>. Не совсем понятно, если не трудно, то приведите пожалуйста конкретный пример.
...
Рейтинг: 0 / 0
02.12.2004, 12:17:32
    #32809277
Leon.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
Bagin Программист-ЛюбительЦепочку удобно именовать как <Имя запроса> + <номера 1, 2 .. >. В конце из них получается <Имя запроса>. Не совсем понятно, если не трудно, то приведите пожалуйста конкретный пример.Ага, я тоже что-то не понял совсем ;-)
...
Рейтинг: 0 / 0
02.12.2004, 13:07:08
    #32809444
Bagin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
Не судьба узнать :-)
...
Рейтинг: 0 / 0
02.12.2004, 13:12:28
    #32809459
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
Цепочка 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
02.12.2004, 13:21:51
    #32809491
Bagin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
2 Программист-Любитель

Спасибо! :-)
...
Рейтинг: 0 / 0
02.12.2004, 14:52:57
    #32809791
paparome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
Код: 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
02.12.2004, 14:58:50
    #32809809
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
На одну ступеньку вычислений выглядит хорошо. На две-три - уже хуже.
...
Рейтинг: 0 / 0
02.12.2004, 15:14:00
    #32809868
Leon.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
8-)
Спасибо всем ответившим. Но все это не то, сами понимаете. Хотелось бы запросто использовать вычисляемые поля в том же SELECTE, да Transact-SQL не разрешает.
...
Рейтинг: 0 / 0
02.12.2004, 15:28:22
    #32809915
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование вычисляемых полей в SELECT
Именно.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Использование вычисляемых полей в SELECT / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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