新手求给下面的语句注释下,详细点最好先谢过了
ALTER FUNCTION [dbo].[fun_XSNN](@TIME char(8))
returns table
as
return
(SELECT MA003 AS 客户全称,Y AS 区域,Z AS 地区,MV002 AS 业务员,SUM(A) AS 订单日金额,SUM(B) AS 订单月金额, SUM(E) AS 订单年金额, SUM(C) AS 销货日金额,SUM(D) AS 销货月金额,SUM(F) AS 销货年金额,SUM(G) AS 应收账款,SUM(H) AS 已出货未开票,SUM(I) AS 超期应收账款金额 FROM 
(
SELECT MA003,TC001,TC002,M.MR003 AS Y,N.MR003 AS Z, MV002,SUM(TC029*TC009) AS A,0 AS B,0 AS E,0 AS C,0 AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTC
LEFT JOIN COPMA ON MA001=TC004
LEFT JOIN CMSMV ON MV001=TC006
LEFT JOIN CMSMQ ON MQ001=TC001
LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
WHERE TC003=@TIME AND TC001<>'2203' AND TC027='Y'
GROUP BY MA003,TC001,TC002,M.MR003,N.MR003,MV002
UNION
SELECT MA003,TC001,TC002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,SUM(TC029*TC009) AS B,0 AS E,0 AS C,0 AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTC
LEFT JOIN COPMA ON MA001=TC004
LEFT JOIN CMSMV ON MV001=TC006
LEFT JOIN CMSMQ ON MQ001=TC001
LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
WHERE SUBSTRING(TC003,1,6)=SUBSTRING(@TIME,1,6) AND TC001<>'2203' AND TC027='Y'
GROUP BY MA003,TC001,TC002,M.MR003,N.MR003,MV002
UNION
SELECT MA003,TC001,TC002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,SUM(TC029*TC009) AS E,0 AS C,0 AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTC
LEFT JOIN COPMA ON MA001=TC004
LEFT JOIN CMSMV ON MV001=TC006
LEFT JOIN CMSMQ ON MQ001=TC001
LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
WHERE SUBSTRING(TC003,1,4)=SUBSTRING(@TIME,1,4) AND TC001<>'2203' AND TC027='Y'
GROUP BY MA003,TC001,TC002,M.MR003,N.MR003,MV002
UNION
SELECT MA003,TG001,TG002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,SUM(TG045) AS C,0 AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTG
LEFT JOIN COPMA ON MA001=TG004
LEFT JOIN CMSMV ON MV001=TG006
LEFT JOIN CMSMQ ON MQ001=TG001
LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
WHERE TG003=@TIME AND TG001<>'2303' AND TG023='Y'
GROUP BY MA003,TG001,TG002,M.MR003,N.MR003,MV002
UNION
SELECT MA003,TG001,TG002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,SUM(TG045) AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTG
LEFT JOIN COPMA ON MA001=TG004
LEFT JOIN CMSMV ON MV001=TG006
LEFT JOIN CMSMQ ON MQ001=TG001
LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
WHERE SUBSTRING(TG003,1,6)=SUBSTRING(@TIME,1,6) AND TG001<>'2303' AND TG023='Y'
GROUP BY MA003,TG001,TG002,M.MR003,N.MR003,MV002
UNION
SELECT MA003,TG001,TG002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,0 AS D,SUM(TG045) AS F,0 AS G,0 AS H,0 AS I FROM COPTG
LEFT JOIN COPMA ON MA001=TG004
LEFT JOIN CMSMV ON MV001=TG006
LEFT JOIN CMSMQ ON MQ001=TG001
LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
WHERE SUBSTRING(TG003,1,4)=SUBSTRING(@TIME,1,4) AND TG001<>'2303' AND TG023='Y'
GROUP BY MA003,TG001,TG002,M.MR003,N.MR003,MV002
UNION
SELECT MA003,TI001,TI002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,SUM(-1*TI037) AS C,0 AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTI
LEFT  JOIN COPMA ON MA001=TI004
LEFT  JOIN CMSMV ON MV001=TI006
LEFT  JOIN CMSMQ ON MQ001=TI001
LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
WHERE TI003=@TIME AND TI019='Y'
GROUP BY MA003,TI001,TI002,M.MR003,N.MR003,MV002
UNION
SELECT MA003,TI001,TI002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,SUM(-1*TI037) AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTI
LEFT  JOIN COPMA ON MA001=TI004
LEFT  JOIN CMSMV ON MV001=TI006
LEFT  JOIN CMSMQ ON MQ001=TI001
LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
WHERE SUBSTRING(TI003,1,6)=SUBSTRING(@TIME,1,6) AND TI019='Y'
GROUP BY MA003,TI001,TI002,M.MR003,N.MR003,MV002
UNION
SELECT MA003,TI001,TI002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,0 AS D,SUM(-1*TI037) AS F,0 AS G,0 AS H,0 AS I FROM COPTI
LEFT  JOIN COPMA ON MA001=TI004
LEFT  JOIN CMSMV ON MV001=TI006
LEFT  JOIN CMSMQ ON MQ001=TI001
LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
WHERE SUBSTRING(TI003,1,4)=SUBSTRING(@TIME,1,4) AND TI019='Y'
GROUP BY MA003,TI001,TI002,M.MR003,N.MR003,MV002
UNION
SELECT MA003,TE006,TE007,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,0 AS D,0 AS F,SUM(TE003+TE004-TE005) AS G,0 AS H,0 AS I FROM ACRTE
LEFT JOIN COPMA ON MA001=TE001
LEFT JOIN CMSMV ON MV001=TE014LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
WHERE TE002=SUBSTRING(@TIME,1,6) 
GROUP BY MA003,TE006,TE007,M.MR003,N.MR003,MV002
UNION SELECT MA003,TG001,TG002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,0 AS D,0 AS F,0 AS G, SUM(TH037) AS H,0 AS I FROM COPTG
LEFT JOIN COPMA ON MA001=TG004
LEFT JOIN CMSMV ON MV001=TG006
LEFT JOIN CMSMQ ON MQ001=TG001
LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
LEFT JOIN COPTH ON TH001=TG001 AND TH002=TG002 AND TH026='N'
WHERE TG001<>'2303' AND TG023='Y' 
GROUP BY MA003,TG001,TG002,M.MR003,N.MR003,MV002UNION
SELECT MA003,TI001,TI002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,0 AS D,0 AS F,0 AS G,SUM(-1*TJ033) AS H,0 AS I FROM COPTI
LEFT  JOIN COPMA ON MA001=TI004
LEFT  JOIN CMSMV ON MV001=TI006
LEFT  JOIN CMSMQ ON MQ001=TI001
LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
LEFT JOIN COPTJ ON TJ001=TI001 AND TJ002=TI002 AND TJ024='N'
WHERE  TI019='Y'
GROUP BY MA003,TI001,TI002,M.MR003,N.MR003,MV002UNION
SELECT MA003,TA001,TA002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,0 AS D,0 AS F,0 AS G,0 AS H,SUM(TA041+TA042-TA098) AS I FROM ACRTA
LEFT JOIN COPMA ON MA001=TA004
LEFT JOIN CMSMV ON MV001=TA005LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
WHERE TA020<=GETDATE() AND TA100<>'3'
GROUP BY MA003,TA001,TA002,M.MR003,N.MR003,MV002) mytable
GROUP BY MA003,Y,Z,MV002
)

解决方案 »

  1.   

    这样的语句都要别人注释,那肯定是基本上没入门的,建议不要想着一口气吃成胖子,还是从基础一步一步来吧!
    这段SQL语句虽然长,但是其实也没什么内容。可以先从总体上来看这个结构,然后一部分一部分的拆分。
      

  2.   

    自己去BAIDU一下表值函数..另外 这个里面好多的LFET JOIN和 UNION啊佩服当初写这个的人
      

  3.   

    ALTER FUNCTION [dbo].[fun_XSNN](@TIME char(8))
    returns table
    as
    return
    (SELECT MA003 AS 客户全称,Y AS 区域,Z AS 地区,MV002 AS 业务员,SUM(A) AS 订单日金额,SUM(B) AS 订单月金额, SUM(E) AS 订单年金额, SUM(C) AS 销货日金额,SUM(D) AS 销货月金额,SUM(F) AS 销货年金额,SUM(G) AS 应收账款,SUM(H) AS 已出货未开票,SUM(I) AS 超期应收账款金额 FROM  
    (
    --从4个表中连接,查出一堆列
    SELECT MA003,TC001,TC002,M.MR003 AS Y,N.MR003 AS Z, MV002,SUM(TC029*TC009) AS A,0 AS B,0 AS E,0 AS C,0 AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTC
    LEFT JOIN COPMA ON MA001=TC004
    LEFT JOIN CMSMV ON MV001=TC006
    LEFT JOIN CMSMQ ON MQ001=TC001
    LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
    LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
    WHERE TC003=@TIME AND TC001<>'2203' AND TC027='Y'
    GROUP BY MA003,TC001,TC002,M.MR003,N.MR003,MV002
    --联合
    UNION
    --从上面提到的4个表中查出另一堆东西
    SELECT MA003,TC001,TC002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,SUM(TC029*TC009) AS B,0 AS E,0 AS C,0 AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTC
    LEFT JOIN COPMA ON MA001=TC004
    LEFT JOIN CMSMV ON MV001=TC006
    LEFT JOIN CMSMQ ON MQ001=TC001
    LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
    LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
    WHERE SUBSTRING(TC003,1,6)=SUBSTRING(@TIME,1,6) AND TC001<>'2203' AND TC027='Y'
    GROUP BY MA003,TC001,TC002,M.MR003,N.MR003,MV002
    --联合
    UNION
    --再从这4个表查出另一堆东西
    SELECT MA003,TC001,TC002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,SUM(TC029*TC009) AS E,0 AS C,0 AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTC
    LEFT JOIN COPMA ON MA001=TC004
    LEFT JOIN CMSMV ON MV001=TC006
    LEFT JOIN CMSMQ ON MQ001=TC001
    LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
    LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
    WHERE SUBSTRING(TC003,1,4)=SUBSTRING(@TIME,1,4) AND TC001<>'2203' AND TC027='Y'
    GROUP BY MA003,TC001,TC002,M.MR003,N.MR003,MV002
    UNION
    --同上
    SELECT MA003,TG001,TG002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,SUM(TG045) AS C,0 AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTG
    LEFT JOIN COPMA ON MA001=TG004
    LEFT JOIN CMSMV ON MV001=TG006
    LEFT JOIN CMSMQ ON MQ001=TG001
    LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
    LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
    WHERE TG003=@TIME AND TG001<>'2303' AND TG023='Y'
    GROUP BY MA003,TG001,TG002,M.MR003,N.MR003,MV002
    UNION
    --同上
    SELECT MA003,TG001,TG002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,SUM(TG045) AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTG
    LEFT JOIN COPMA ON MA001=TG004
    LEFT JOIN CMSMV ON MV001=TG006
    LEFT JOIN CMSMQ ON MQ001=TG001
    LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
    LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
    WHERE SUBSTRING(TG003,1,6)=SUBSTRING(@TIME,1,6) AND TG001<>'2303' AND TG023='Y'
    GROUP BY MA003,TG001,TG002,M.MR003,N.MR003,MV002
    UNION
    --同上
    SELECT MA003,TG001,TG002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,0 AS D,SUM(TG045) AS F,0 AS G,0 AS H,0 AS I FROM COPTG
    LEFT JOIN COPMA ON MA001=TG004
    LEFT JOIN CMSMV ON MV001=TG006
    LEFT JOIN CMSMQ ON MQ001=TG001
    LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
    LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
    WHERE SUBSTRING(TG003,1,4)=SUBSTRING(@TIME,1,4) AND TG001<>'2303' AND TG023='Y'
    GROUP BY MA003,TG001,TG002,M.MR003,N.MR003,MV002
    UNION
    --同上
    SELECT MA003,TI001,TI002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,SUM(-1*TI037) AS C,0 AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTI
    LEFT JOIN COPMA ON MA001=TI004
    LEFT JOIN CMSMV ON MV001=TI006
    LEFT JOIN CMSMQ ON MQ001=TI001
    LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
    LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
    WHERE TI003=@TIME AND TI019='Y'
    GROUP BY MA003,TI001,TI002,M.MR003,N.MR003,MV002
    UNION
    --同上
    SELECT MA003,TI001,TI002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,SUM(-1*TI037) AS D,0 AS F,0 AS G,0 AS H,0 AS I FROM COPTI
    LEFT JOIN COPMA ON MA001=TI004
    LEFT JOIN CMSMV ON MV001=TI006
    LEFT JOIN CMSMQ ON MQ001=TI001
    LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
    LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
    WHERE SUBSTRING(TI003,1,6)=SUBSTRING(@TIME,1,6) AND TI019='Y'
    GROUP BY MA003,TI001,TI002,M.MR003,N.MR003,MV002
    UNION
    --同上
    SELECT MA003,TI001,TI002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,0 AS D,SUM(-1*TI037) AS F,0 AS G,0 AS H,0 AS I FROM COPTI
    LEFT JOIN COPMA ON MA001=TI004
    LEFT JOIN CMSMV ON MV001=TI006
    LEFT JOIN CMSMQ ON MQ001=TI001
    LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
    LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
    WHERE SUBSTRING(TI003,1,4)=SUBSTRING(@TIME,1,4) AND TI019='Y'
    GROUP BY MA003,TI001,TI002,M.MR003,N.MR003,MV002
    UNION
    --换成4个中的3个表
    SELECT MA003,TE006,TE007,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,0 AS D,0 AS F,SUM(TE003+TE004-TE005) AS G,0 AS H,0 AS I FROM ACRTE
    LEFT JOIN COPMA ON MA001=TE001
    LEFT JOIN CMSMV ON MV001=TE014LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
    LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
    WHERE TE002=SUBSTRING(@TIME,1,6)  
    GROUP BY MA003,TE006,TE007,M.MR003,N.MR003,MV002
    UNION  --又回到原来4个SELECT MA003,TG001,TG002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,0 AS D,0 AS F,0 AS G, SUM(TH037) AS H,0 AS I FROM COPTG
    LEFT JOIN COPMA ON MA001=TG004
    LEFT JOIN CMSMV ON MV001=TG006
    LEFT JOIN CMSMQ ON MQ001=TG001
    LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
    LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
    LEFT JOIN COPTH ON TH001=TG001 AND TH002=TG002 AND TH026='N'
    WHERE TG001<>'2303' AND TG023='Y'  
    GROUP BY MA003,TG001,TG002,M.MR003,N.MR003,MV002UNION
    SELECT MA003,TI001,TI002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,0 AS D,0 AS F,0 AS G,SUM(-1*TJ033) AS H,0 AS I FROM COPTI
    LEFT JOIN COPMA ON MA001=TI004
    LEFT JOIN CMSMV ON MV001=TI006
    LEFT JOIN CMSMQ ON MQ001=TI001
    LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
    LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
    LEFT JOIN COPTJ ON TJ001=TI001 AND TJ002=TI002 AND TJ024='N'
    WHERE TI019='Y'
    GROUP BY MA003,TI001,TI002,M.MR003,N.MR003,MV002UNION
    --换表
    SELECT MA003,TA001,TA002,M.MR003 AS Y,N.MR003 AS Z,MV002,0 AS A,0 AS B,0 AS E,0 AS C,0 AS D,0 AS F,0 AS G,0 AS H,SUM(TA041+TA042-TA098) AS I FROM ACRTA
    LEFT JOIN COPMA ON MA001=TA004
    LEFT JOIN CMSMV ON MV001=TA005LEFT JOIN CMSMR AS M ON MA017=M.MR002 AND M.MR001='1'
    LEFT JOIN CMSMR AS N ON MA018=N.MR002 AND N.MR001='3'
    WHERE TA020<=GETDATE() AND TA100<>'3'
    GROUP BY MA003,TA001,TA002,M.MR003,N.MR003,MV002) mytable
    GROUP BY MA003,Y,Z,MV002
    )写得真烂,大多是从指定的4个表中抽取数据,联合,如果几个case,至少能省去一大半.