SELECT DISTINCT A.[客户号],B.[客户名称],A.[规格],A.[轻瓶数量],A.[重瓶数量],A.[轻瓶重量],A.[重瓶重量],A.[瓶重误差],A.[核对结果] FROM  
(SELECT Convert(Char(10),ISNULL(轻瓶重量.客户号, 重瓶重量.客户号))AS 客户号,int_guest,轻瓶重量.规格 as 规格,轻瓶重量.瓶数 AS 轻瓶数量,
重瓶重量.瓶数 AS 重瓶数量,轻瓶重量.重量 AS 轻瓶重量,重瓶重量.重量 AS 重瓶重量,Convert(decimal(18,2),
(重瓶重量.重量 - 轻瓶重量.重量)/ 轻瓶重量.重量*100) AS 瓶重误差, CASE WHEN isnull(轻瓶重量.瓶数, 0) = isnull(重瓶重量.瓶数, 0) and 
abs((重瓶重量.重量 - 轻瓶重量.重量)/ 轻瓶重量.重量*100)<=0 THEN '√' ELSE '' END AS 核对结果 FROM 
(SELECT convert(char(10),record_data,120) as 日期,INT_GUEST AS 客户号,int_guest,STR_BOTTLESORT as 规格,COUNT(*) AS 瓶数,
SUM(Convert(decimal(18,2),FLOAT_ZZ))AS 重量  FROM [GZ_TABLE] WHERE (INT_SCALE IN (9)) AND (RECORD_DATA BETWEEN 
CONVERT(DATETIME, '2008-6-5 0:00:00', 102) AND CONVERT(DATETIME,'2008-6-6 0:00:00', 102))GROUP BY INT_GUEST,STR_BOTTLESORT,
convert(char(10),record_data,120)) 轻瓶重量 --轻瓶重量 
FULL OUTER JOIN(SELECT convert(char(10),record_data,120) as 日期,INT_GUEST AS 客户号,STR_BOTTLESORT as 规格,COUNT(*) AS 瓶数,
SUM(Convert(decimal(18,2),FLOAT_pz))AS 重量 FROM [GZ_TABLE] WHERE(INT_scale not IN (9))AND(RECORD_DATA BETWEEN
 CONVERT(DATETIME,'2008-6-5 0:00:00', 102) AND CONVERT(DATETIME, '2008-6-6 0:00:00', 102))
GROUP BY INT_GUEST,STR_BOTTLESORT,convert(char(10),record_data,120)) 重瓶重量 --重瓶重量
ON 轻瓶重量.客户号 = 重瓶重量.客户号 and 轻瓶重量.规格=重瓶重量.规格 and 轻瓶重量.日期=重瓶重量.日期)A inner join 
(select A.FullName as 客户名称,B.int_guest from Client_Info A inner join GZ_Table B on convert(int,A.Client_ID)= B.int_guest where 
convert(int,Client_ID)= B.int_guest and A.Del_Flag=0)B on A.int_guest=B.int_guest where 轻瓶数量>0 
UNION ALL -- 合计
SELECT null,'合计',null,
SUM([轻瓶数量]), SUM([重瓶数量]), SUM([轻瓶重量]), SUM([重瓶重量]),convert(decimal(18,2),avg([瓶重误差])),CASE WHEN 
isnull(SUM([轻瓶数量]), 0)=isnull(SUM([重瓶数量]),0) and abs(avg(瓶重误差))<=0 THEN '√' ELSE '' END AS [核对结果] FROM 
(SELECT Convert(Char(10),ISNULL(轻瓶重量.客户号, 重瓶重量.客户号))AS 客户号,int_guest,轻瓶重量.规格 as 规格,轻瓶重量.瓶数 AS 轻瓶数量,
重瓶重量.瓶数 AS 重瓶数量,轻瓶重量.重量 AS 轻瓶重量,重瓶重量.重量 AS 重瓶重量,Convert(decimal(18,2),
(重瓶重量.重量 - 轻瓶重量.重量)/ 轻瓶重量.重量*100) AS 瓶重误差, CASE WHEN isnull(轻瓶重量.瓶数, 0) = isnull(重瓶重量.瓶数, 0) and 
abs((重瓶重量.重量 - 轻瓶重量.重量)/ 轻瓶重量.重量*100)<=0 THEN '√' ELSE '' END AS 核对结果 FROM 
(SELECT convert(char(10),record_data,120) as 日期,INT_GUEST AS 客户号,int_guest,STR_BOTTLESORT as 规格,COUNT(*) AS 瓶数,
SUM(Convert(decimal(18,2),FLOAT_ZZ)) AS 重量  FROM [GZ_TABLE] WHERE (INT_SCALE IN (9)) AND (RECORD_DATA BETWEEN  CONVERT(DATETIME, 
'2008-6-5 0:00:00', 102)AND CONVERT(DATETIME,'2008-6-6 0:00:00',102))GROUP BY INT_GUEST,STR_BOTTLESORT,convert(char(10),record_data,120)) 
轻瓶重量 FULL OUTER JOIN 
(SELECT convert(char(10),record_data,120)as 日期,INT_GUEST AS 客户号,STR_BOTTLESORT as 规格,COUNT(*) AS 瓶数, SUM(Convert(decimal(18,2),
FLOAT_pz)) AS 重量  FROM [GZ_TABLE] WHERE (INT_scale not IN (9)) AND (RECORD_DATA BETWEEN CONVERT(DATETIME, '2008-6-5 0:00:00', 102)
 AND CONVERT(DATETIME, '2008-6-6 0:00:00', 102))  GROUP BY INT_GUEST,STR_BOTTLESORT,convert(char(10),record_data,120))重瓶重量 ON 
轻瓶重量.客户号 = 重瓶重量.客户号 and 轻瓶重量.规格=重瓶重量.规格 and 轻瓶重量.日期=重瓶重量.日期) AS t2 where 轻瓶数量>0现在此语句执行起来速度太慢 严重影响了性能 希望SQL语句高手能简而化之..

解决方案 »

  1.   

    两个表,GZ_TABLE 灌装表 Client_Info客户表,此查询中需要的字段下面会有注解.
    需要查询出来的就是[客户号],[客户名称],[规格],[轻瓶数量],[重瓶数量],[轻瓶重量],[重瓶重量],[瓶重误差],[核对结果],具体取值可参考上面的语句,功能是实现了.可是在程序里面运行得太慢了
    CREATE TABLE [GZ_TABLE] (
    [ID] [int] IDENTITY (1, 1) NOT NULL ,
    [INT_SCALE] [int] NULL ,
    [STATE_ZERO] [int] NULL ,
    [STATE_ONE] [int] NULL ,
    [STATE_TWO] [int] NULL ,
    [STATE_SIX] [int] NULL ,
    [STATE_SEVEN] [int] NULL ,
    [INT_STAFF] [int] NULL ,
    [INT_ZUOBI] [int] NULL ,
    [INT_GUEST] [int] NULL , --客户ID
    [INT_BOTTLENUM] [int] NULL ,
    [STR_SITE] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,
    [RECORD_DATA] [datetime] NULL ,  
    [PLAN_POINT_NUM] [int] NULL ,
    [STR_BOTTLESORT] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,
    [STR_GUESTNAME] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [FLOAT_JZ] [numeric](18, 5) NULL ,
    [FLOAT_ZZ] [numeric](18, 5) NULL ,
    [PLAN_WEIGHT] [numeric](9, 2) NULL ,
    [FLOAT_PZ] [numeric](18, 5) NULL ,
    [PLAN_POINT_SORT] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [DoMain_ID] [varchar] (2) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
    CREATE TABLE [Client_Info] (
    [ID] [int] IDENTITY (1, 1) NOT NULL ,
    [Domain_ID] [varchar] (2) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [Client_ID] [varchar] (8) COLLATE Chinese_PRC_CI_AS NOT NULL , --客户ID
    [Area] [varchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
    [FullName] [varchar] (70) COLLATE Chinese_PRC_CI_AS NULL ,  --客户名称
    [ShortName] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
    [Address] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
    [Tel] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [ClientType] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
    [Grade] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [AccountDay] [int] NULL ,
    [Pym] [varchar] (70) COLLATE Chinese_PRC_CI_AS NULL ,
    [CardNo] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
    [IssueDate] [datetime] NULL ,
    [Lose_Flag] [bit] NULL ,
    [Publisher] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [Del_Flag] [bit] NOT NULL CONSTRAINT [DF_Client_Info_Del_Flag] DEFAULT (0),
    [DBUpdate] [varchar] (1) COLLATE Chinese_PRC_CI_AS NOT NULL CONSTRAINT [DF_Client_Info_DBUpdate] DEFAULT (1),
    [payoff_Type] [varchar] (16) COLLATE Chinese_PRC_CI_AS NULL ,
    [PUG_Type] [varchar] (16) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
      

  2.   

    你试试这个语句看行不行,不太了解你的条件只能跟据你这条语句进行简化了,自己做了一些数据,和你的数据结果是一样的,不过能不能快点就要看你的索引怎么做的了。SELECT 客户号,ISNULL(A.FullName,'合计') AS 客户名称,规格,轻瓶数量,重瓶数量,轻瓶重量,重瓶重量,Convert(decimal(18,2), (重瓶重量 - 轻瓶重量)/ 轻瓶重量*100) AS 瓶重误差,CASE WHEN isnull(轻瓶数量, 0) = isnull(重瓶数量, 0) and abs((重瓶重量 - 轻瓶重量)/ 轻瓶重量*100) <=0 THEN '√' ELSE '' END AS 核对结果  FROM 
    (
    SELECT INT_GUEST 客户号,STR_BOTTLESORT as 规格,SUM(CASE WHEN INT_SCALE IN (9) THEN 1 ELSE 0 END ) AS 轻瓶数量,SUM(CASE WHEN INT_SCALE IN (9) THEN 0 ELSE 1 END ) AS 重瓶数量,SUM(CASE WHEN INT_SCALE IN (9) THEN Convert(decimal(18,2),FLOAT_ZZ) ELSE 0 END ) AS 轻瓶重量 ,SUM(CASE WHEN INT_SCALE IN (9) THEN 0 ELSE Convert(decimal(18,2),FLOAT_ZZ) END ) AS 重瓶重量 FROM [GZ_TABLE] WHERE (RECORD_DATA BETWEEN CONVERT(DATETIME, '2008-6-5 0:00:00', 102) AND CONVERT(DATETIME, '2008-6-6 0:00:00', 102)) GROUP BY INT_GUEST,STR_BOTTLESORT WITH ROLLUP 
    HAVING  GROUPING(STR_BOTTLESORT) = 0 OR GROUPING(INT_GUEST) = 1
    ) B LEFT JOIN Client_Info A ON convert(int,A.Client_ID)= B.客户号
    WHERE 轻瓶数量>0 
      

  3.   

    多谢最后一位,问题解决了. 不过我的重瓶重量和重瓶数量是not in 所以,最后的语句应该是SELECT 客户号,ISNULL(A.FullName,'合计') AS 客户名称,ISNULL(规格,'累计:')as 规格,轻瓶数量,重瓶数量,轻瓶重量,重瓶重量,Convert(decimal(18,2), (重瓶重量 - 轻瓶重量)/ 轻瓶重量*100) AS 瓶重误差,CASE WHEN isnull(轻瓶数量, 0) = isnull(重瓶数量, 0) and abs((重瓶重量 - 轻瓶重量)/ 轻瓶重量*100) <=0 THEN '√' ELSE '' END AS 核对结果  FROM 

    SELECT INT_GUEST 客户号,STR_BOTTLESORT as 规格,SUM(CASE WHEN INT_SCALE IN (9) THEN 1 ELSE 0 END ) AS 轻瓶数量,SUM(CASE WHEN INT_SCALE NOT IN (9) THEN 0 ELSE 1 END ) AS 重瓶数量,SUM(CASE WHEN INT_SCALE IN (9) THEN Convert(decimal(18,2),FLOAT_ZZ) ELSE 0 END ) AS 轻瓶重量 ,SUM(CASE WHEN INT_SCALE NOT IN (9) THEN 0 ELSE Convert(decimal(18,2),FLOAT_ZZ) END ) AS 重瓶重量 FROM [GZ_TABLE] WHERE (RECORD_DATA BETWEEN CONVERT(DATETIME, '2008-6-5 0:00:00', 102) AND CONVERT(DATETIME, '2008-6-6 0:00:00', 102)) GROUP BY INT_GUEST,STR_BOTTLESORT WITH ROLLUP 
    HAVING  GROUPING(STR_BOTTLESORT) = 0 OR GROUPING(INT_GUEST) = 1 
    ) B LEFT JOIN Client_Info A ON convert(int,A.Client_ID)= B.客户号 
    WHERE 轻瓶数量>0 结贴咯~!