回答

收藏

如何在SQL Server 2008表中创建计算列

技术问答 技术问答 140 人阅读 | 0 人回复 | 2023-09-13

我真的需要一个具有简单总和的表上的计算列。
( T8 y. h- L: V请看下面:! T, J( u. l1 b( F
SELECT   key38 J/ Y- s( u7 J5 F
         ,SUM(UTOTALWBUD)
% m8 l5 k1 o+ e% _FROM     CONTACT1
4 Z9 f+ c5 b+ A. Q         INNER JOIN CONTACT2$ K' B- ], E; ^3 |$ [/ d' u
            ON CONTACT1.ACCOUNTNO = CONTACT2.ACCOUNTNO
0 z! c' w3 w; j9 R' H  e$ e3 MWHERE    KEY1 = 'Client'
1 A  {; p6 [, n; \2 hGROUP BY KEY3
0 `/ x  Z# p7 M; V' x. }我试图通过添加以下内容来创建计算列
' K7 p2 L  J% D- s+ m* YALTER TABLE ManagerTaLog
1 z  x& z% F" C  h* d# o, ]ADD         WeeklyBudget as (   SELECT
) }0 d- X9 E' O) V" ^: p2 r, E                                        key3
4 ^" ]6 ?& Q8 F                                        ,SUM(UTOTALWBUD)
" M  Q- m7 d) ]5 p                            FROM        CONTACT1, k* }0 G4 u  K+ ~
                                        JOIN CONTACT2
; F; t6 B" g" h5 `. C% l                                            ON CONTACT1.ACCOUNTNO = CONTACT2.ACCOUNTNO
" Q. P& J. q) l4 w$ k                            WHERE       KEY1 = 'Client'+ [/ P2 ]; i: `- M
                            GROUP BY    KEY3)
8 w% d! ?# z5 R* T我收到错误消息:' Y1 g* V2 D, H
0 [) H$ X2 [9 ^5 _8 e/ L
在这种情况下,不允许消息1046,级别15,状态1,第4行子查询。仅允许标量表达式。9 [1 m1 ?& _) r( {- z8 X, R( |! B
2 i4 Y5 t3 X5 {7 z8 t, k
请告知我该怎么办。
6 u* S/ p8 H& W( `2 }9 T非常感谢2 e+ [* M0 ~4 N0 q! X& s7 ]
第2部分
' x$ B* D8 ~  n6 B' V2 l+ ?& \我已经创建了一个函数;但是,我得到空值,请指教。
% Q& |3 ^* H# j3 V  d: J5 P' ]CREATE FUNCTION [dbo].[SumIt](@Key3 varchar)( g3 ]/ a+ d% @& m0 x9 c% m
RETURNS TABLE * T) Y: C' v! {/ U9 w1 _
AS
8 \7 a! {. j9 G5 J9 sRETURN
) J! Z$ b; V2 i7 _- ~) M! t) r3 [! J" m(
9 u3 \% T8 p1 z& NSELECT      SUM(UTOTALWBUD)5 i. L4 ~2 R( U
FROM        CONTACT1
, t$ m: D- X) Q3 t4 {2 U            JOIN CONTACT27 x4 d# Z2 D8 F% l
                ON CONTACT1.ACCOUNTNO = CONTACT2.ACCOUNTNO' H. d" Q' z) T# o
            JOIN Phone_List
, a' z( f8 b  E4 x                ON CONTACT1.KEY3 = Phone_List.[Manager ]
6 r2 Z; e6 T" c: w) q: FWHERE       KEY1 = 'Client'
3 N! `+ h8 d) y1 |) j, ~            AND Phone_List.[Manager ] = @Key33 t. M5 g# |9 }. M$ A' q
GROUP BY [Manager ]% }% T# [$ @- Z* }$ x3 }* y' A
)
' y# F5 K) K# x6 qEND- I9 S" ~3 W5 ]6 C
GO& x" Q* b( Y' S/ I: m, {
只需选择返回要添加到Phone_list表中的值的语句+ H' T! Q( }$ G0 m: f
SELECT      [Manager ]7 o2 x( m% i" k8 P
            ,SUM(UTOTALWBUD)
' r: E3 {$ o+ EFROM        CONTACT16 P% v( x+ Z  b/ `1 c" X
            JOIN CONTACT22 j) X* V. ^8 N3 O1 h
                ON CONTACT1.ACCOUNTNO = CONTACT2.ACCOUNTNO# y# E$ P( X! x" @; W; L1 l, G* y
            JOIN Phone_List
! g% W* x. a  P4 P, |5 m                ON CONTACT1.KEY3 = Phone_List.[Manager ]
/ |4 F" S2 W$ c5 }  LWHERE       KEY1 = 'Client'
8 J$ z* ^9 n9 |3 xGROUP BY    [Manager ]2 E$ C! z& |8 y
表定义
9 ^1 a+ g+ w) f& U2 Q4 wCREATE TABLE [dbo].[CONTACT1](" }) u( N+ I" }
    [ACCOUNTNO] [varchar](20) NOT NULL,
/ Q% C: i8 R$ K) s8 x3 r    [COMPANY] [varchar](40) NULL,
- ?5 P5 m- i/ k1 P' D& B  p. _$ \* O    [CONTACT] [varchar](40) NULL,# v/ o2 M# @5 r" m
    [LASTNAME] [varchar](15) NULL,4 f- C, C3 @  {
    [DEPARTMENT] [varchar](35) NULL," H; U0 j0 x2 [5 M
    [TITLE] [varchar](35) NULL,* R* T+ _! F0 U. d4 G  N) S
    [SECR] [varchar](20) NULL,; i- T2 c; q$ k9 F9 T
    [PHONE1] [varchar](25) NOT NULL,9 h7 u/ W5 ~6 F: F- O+ w& ?
    [PHONE2] [varchar](25) NULL,3 k* b' [) r) o
    [PHONE3] [varchar](25) NULL,$ S6 |& _( [" X" n
    [FAX] [varchar](25) NULL,  {; s, ~" c2 ^8 g, S. O7 k
    [EXT1] [varchar](6) NULL,7 |" J6 B  t" y3 c/ T* R' Q& w
    [EXT2] [varchar](6) NULL,
& B( p) F! Q" Q0 ~: O8 }    [EXT3] [varchar](6) NULL,
4 I1 Q9 q: n, _2 F$ \! u    [EXT4] [varchar](6) NULL,
2 ^- o  H- i: r3 s7 ]  G& k% D    [ADDRESS1] [varchar](40) NULL,
8 d/ @+ O! [8 I! X    [ADDRESS2] [varchar](40) NULL,
& J( l; g$ g. F. J  c5 ?    [ADDRESS3] [varchar](40) NULL,
" [4 _! q& h: i/ G3 {) }8 Y; x    [CITY] [varchar](30) NULL,
( r& }" K& S& `: l  i  x# y    [STATE] [varchar](20) NULL,$ U8 l# B$ _$ ^  D% D6 Z  [
    [ZIP] [varchar](10) NOT NULL,4 m% t8 t* f( d! d+ r0 X; a; f
    [COUNTRY] [varchar](20) NULL,4 }, _, I. d$ ~/ N, g. x  K
    [DEAR] [varchar](20) NULL,
! ?) t6 K  P# ]1 E2 ^3 [9 [6 l/ R    [SOURCE] [varchar](20) NULL,
- o9 s# g# @1 N: b/ Y  |3 {    [KEY1] [varchar](20) NULL,
& E* \, ]% B0 e/ z    [KEY2] [varchar](20) NULL,6 a7 _4 m: g3 x4 Y5 n
    [KEY3] [varchar](20) NULL,
% u. o) s1 q2 E( X% F$ x6 K; _0 o: y    [KEY4] [varchar](20) NULL,
& U& Q" R8 y( x3 I: j6 G    [KEY5] [varchar](20) NULL,
  H# t& w$ t& K& r# C5 b    [STATUS] [varchar](3) NOT NULL,
/ |  s. M  v' n0 \$ @  V    [NOTES] [text] NULL,$ Z* I( N7 P! ?4 W8 N( ^+ w& n
    [MERGECODES] [varchar](20) NULL,% s/ r( Q/ B) h( N
    [CREATEBY] [varchar](8) NULL,) ~+ f# P$ P! Z! E5 ^6 |8 ^; Z( f
    [CREATEON] [datetime] NULL,. \/ w& H1 }5 I# n) V6 l
    [CREATEAT] [varchar](5) NULL,% ~1 G, @' e) {
    [OWNER] [varchar](8) NOT NULL,+ o' \1 k% L& @/ T+ _
    [LASTUSER] [varchar](8) NULL,+ Z- B- k& ]$ @# {
    [LASTDATE] [datetime] NULL,
! Q: P+ c5 |. N  u3 w2 O3 u* R8 C7 ^    [LASTTIME] [varchar](5) NULL,5 R- e% G' |2 ^
    [U_COMPANY] [varchar](40) NOT NULL,) [5 P6 S8 a$ G7 \7 a) C" R
    [U_CONTACT] [varchar](40) NOT NULL,; O9 g: [, s/ I. ^1 k$ p
    [U_LASTNAME] [varchar](15) NOT NULL,
9 h  \( b$ r8 B: K# k. H    [U_CITY] [varchar](30) NOT NULL,
+ W2 C2 U0 B+ L: F7 u- j    [U_STATE] [varchar](20) NOT NULL,
6 j2 h- P& V, ~2 `    [U_COUNTRY] [varchar](20) NOT NULL,
, q" M" T* _: l/ E3 C    [U_KEY1] [varchar](20) NOT NULL,9 T- ~: [1 Y/ u4 l6 |
    [U_KEY2] [varchar](20) NOT NULL,
! Q; S$ g' o6 q    [U_KEY3] [varchar](20) NOT NULL,3 q6 d7 [% w. D
    [U_KEY4] [varchar](20) NOT NULL,% m# x# }% F+ k# C" C) s4 U
    [U_KEY5] [varchar](20) NOT NULL,
4 h9 A0 x4 W' B, p1 p% P: w    [recid] [varchar](15) NOT NULL
' j9 V7 X! G; `& o) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
7 U7 z. ^/ v& a. UGO6 a$ ?3 z& U( R9 z0 L& R
) z) W1 A/ |# K9 f6 G
CREATE TABLE [dbo].[Phone_List](
8 M/ I6 y8 S# e. ^) B    [Manager ] [nvarchar](255) NULL,+ z. d: J5 c6 |" f9 |7 s: U0 k8 j! O
    [SalesCode] [nvarchar](255) NULL,' b/ U* [" |. k6 I( |, }/ ~  d3 J
    [Email] [nvarchar](255) NULL,- n: F( e+ x* ~8 U9 c& K, o
    [PayrollCode] [nvarchar](255) NULL,# W- Z# \3 e; V9 D
    [Mobile] [nvarchar](255) NULL,
! _: N7 z2 \& Q1 T6 |1 D# @8 r    [FName] [nchar](20) NULL,+ c0 d" ~! Y3 J/ F
    [idd] [tinyint] NULL,# r5 `7 f* a  Q! V: m
    [OD] [varchar](20) NULL,
+ w  W- r! Z  l4 m; W& J    [WeeklyBudget]  AS ([dbo].[SumIt]([manager])). R0 Q7 t! p# Q' n# }) T
) ON [PRIMARY]3 d  ~: F" m& ~7 `! `0 ^
               
8 g" j6 _2 t$ Y, `4 K# }/ z解决方案:
- Z  r! @  L2 `" n7 L! \                ; {/ @1 }8 \& G
2 d) C8 L: [3 i  W
  Y2 {2 k$ q+ V7 Q1 E; s2 L
                你可以用你的查询到这样的(它的功能 HAS 返回一个值):
. B- E1 ^; Y4 A  ]5 y4 Q  ?. n5 i+ YCREATE FUNCTION dbo.SumIt(@Key1 varchar(max))
# l) k; w# {4 ?; w* jreturns float& x5 W5 H' D( p. c5 q, t1 T4 I8 I/ _
as
3 Y# v6 S& q8 B9 hbegin7 g/ M3 ~2 A9 M' A  c) Y, @
  return (select sum(UTOTALWBUD) from
% q4 `; G4 J# B9 |   CONTACT1 inner join& ]+ i' B. R# k
   CONTACT2 on
7 ?3 v) f9 f; ]/ ?) K! X/ B   CONTACT1.ACCOUNTNO=CONTACT2.ACCOUNTNO
1 O5 Y, Q/ l+ C% [$ C   where KEY1=@key1' a! `7 j" @! s% H* W2 J% c
   group by KEY3)
% D# `& D( c# U0 kEND
0 Z8 X% s# m* ~6 F1 c并使用此函数代替calc字段-像这样:
  @3 b# D, l& K1 a6 d& Jalter table ManagerTaLog add WeeklyBudget as dbo.SumIt(Key1)
( |' Q; w9 d) e: ?- [) ~2 |: Z, |笔记
( [0 k0 J7 R$ p/ G- ]6 p这将是诸如此类查询的性能杀手:' x3 w' u* s3 n/ M+ \: K
select * from ManagerTaLog( J' G+ t* U. t* S% ?* m5 S
您应该以这种方式更改函数,即接受 NOT varchar值,但是NVARCHAR(255)-与Manager列的类型相同。试试吧。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则