2014-10-16 229 views
0

我需要一些帮助来总结两个(或更多)别名列。 我知道我需要一个派生表来完成它,但到目前为止,我迷失在线教程和文档,因为它们的示例太简单了。他们只有一个表,两列等在SQL Server中创建派生表

什么能在这里我最好的选择: 我需要计算两个别名列的总和:“InFxO”和“OnTxO”和我的代码如下:

ALTER PROC [dbo].[DIFOTIS] 
@Mode as Varchar (5) 
AS 
Begin 
Declare 

@StartDate date, 
@EndDate date 

SET @StartDate= 
CASE @Mode 
WHEN 'MTD' THEN DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0) 
WHEN 'YTD' THEN DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0) 
WHEN 'QTD' THEN DATEADD(qq,DATEDIFF(qq,0,GETDATE()),0) 
WHEN 'WTD' THEN DATEADD(wk,DATEDIFF(wk,0,GETDATE()),0) 
END 
Set @EndDate= 
CASE @Mode 
WHEN 'MTD' THEN DATEADD(mm,DATEDIFF(mm,0,GETDATE())+1,0) 
WHEN 'YTD' THEN DATEADD(yy,DATEDIFF(yy,0,GETDATE())+1,0) 
WHEN 'QTD' THEN DATEADD(qq,DATEDIFF(qq,0,GETDATE())+1,0) 
WHEN 'WTD' THEN DATEADD(wk,DATEDIFF(wk,0,GETDATE())+1,0) 
END 


Select DATEPART(ISO_WEEK,d.DateOpn) AS 'Week#' 
,Clients.CustCateg, Clients.ClntGroup 
,d.DocumentCode as 'CORD_DocumentCode' 
,CDSPDocs.DocumentCode AS 'DESP_DocumentCode' 
,Count(CORDLines.Qnty) AS 'Cord_Lines' 
,SUM(CORDLines.Qnty) AS 'CORD_Qty' 
,Count(CDSPLines.Qnty) AS 'DESP_Lines' 
,Sum(CDSPLines.Qnty) AS 'DESP_Qty' 
,CDSPLines.Status, d.Status as d_status 
,d.OpenDate, d.DateDue 
,CDSPDocs.PostDate AS 'DESP_PostedDate' 
,d.DocType, DATEDIFF(day, d.OpenDate, d.DateDue) AS 'Lead times' 

    --in-full 

,CASE WHEN SUM(CORDLines.Qnty) = Sum(CDSPLines.Qnty) THEN '1' ELSE '0' END as InFxO 


    --On-Time by order according to Despatch SLAs 

,CASE WHEN (Clients.ClntGroup IN ('Local Market','Local Market - Pharm','Web Sales - Local','Web Sales - Export', 'Mail Order','Mail Order - Export')) AND (Datediff(day, d.OpenDate, CDSPDocs.PostDate) - (Datediff(Week, d.OpenDate, CDSPDocs.PostDate)*2) <= 2) then '1' 
     WHEN (Clients.ClntGroup = 'Export Market') AND (Datediff(day, d.OpenDate, CDSPDocs.PostDate) - (Datediff(Week, d.OpenDate, CDSPDocs.PostDate)*2) <= 14) then '1' 
     WHEN (Clients.ClntGroup = 'Export Market') or Clients.CustCateg = 'UK Transfer' AND (d.DateDue >= CDSPDocs.PostDate) then '1' 
     ELSE '0' 
     END as OnTxO 


From dbo.Documents AS d INNER JOIN 
    dbo.Clients ON d.ObjectID = dbo.Clients.ClntID AND Clients.ClientName <> 'Samples - Free/Give-aways' LEFT Outer JOIN 
    dbo.DocumentsLines AS CORDLines ON d.DocID = CORDLines.DocID AND CORDLines.TrnType = 'L' 
    LEFT OUTER JOIN 
    dbo.DocumentsLines AS CDSPLines ON CORDLines.TranID = CDSPLines.SourceID AND CDSPLines.TrnType = 'L' AND (CDSPLines.Status = 'Posted' OR CDSPLines.Status = 'Closed') LEFT OUTER JOIN 
    dbo.Documents AS CDSPDocs ON CDSPLines.DocID = CDSPDocs.DocID 

WHERE (d.DocType IN ('CASW', 'CORD','MORD')) 
AND (CORDLines.LneType NOT In ('Fght','MANF','Stor', 'PACK','EXPS')) 
AND d.DateOpn >= @StartDate AND d.DateOpn < @EndDate 
AND (CORDLines.LneType is not null) 
AND (d.DateDue <= Convert(Date, GetDate(), 101)) 

Group by d.DateOpn 
,d.DocumentCode 
,Clients.CustCateg 
,CDSPDocs.DocumentCode 
,d.[Status] 
,d.DocType 
,d.OpenDate 
,d.DateReq 
,CDSPDocs.PostDate 
,CDSPLines.[Status] 
,Clients.ClntGroup 
,d.DocumentName 
,d.DateDue 
,d.DateOpn 

ORDER BY d.DateOpn, 'Week#' 
    END 


GO 

所有帮助表示赞赏。 谢谢 H

+0

您提到了SUM InFxO和OnTxO列,但这些表达式当前返回varchar而不是数值。您是否希望CASE espressions返回整数值0或1?你只是想将整个查询封装在一个派生表中,并用这两个表达式的SUM返回一行? – 2014-10-17 03:44:31

+0

嗨Dan,谢谢你的回复。我的意图是在两个别名列中返回一个整数,并在第三列(InFxO + OnTxO)中使用SUM ...然后将结果用于SSRS'iif“2”中的计算字段,然后... 道歉,但我不知道你的意思是封装整个查询......我对这个SQL世界相当陌生,一些“最佳实践”超出了我的范围。如果这些将改进我的查询并教我如何在将来做到这一点,我愿意接受。 – Eric 2014-10-17 08:58:12

回答

0

下面是一个将原始查询包装在派生表中的示例,以便您不需要重复SUM的CASE表达式。您可以类似地将查询包装在公用表格表达式中以获得相同的结果。

我建议您仅使用单引号将字符串文字括起来,并使用方括号或双引号括起标识符(列名,别名和对象名称),如SQL Server联机丛书参考(http://msdn.microsoft.com/en-us/library/ms175874.aspx)中所述。标识符只有当它们不符合标识符命名规则或者是保留关键字时才需要被包含。

ALTER PROC dbo.DIFOTIS @Mode AS varchar(5) 
AS 
    BEGIN 
     DECLARE @StartDate date 
      , @EndDate date; 

     SET @StartDate = CASE @Mode 
          WHEN 'MTD' 
          THEN DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0) 
          WHEN 'YTD' 
          THEN DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) 
          WHEN 'QTD' 
          THEN DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0) 
          WHEN 'WTD' 
          THEN DATEADD(wk, DATEDIFF(wk, 0, GETDATE()), 0) 
         END; 
     SET @EndDate = CASE @Mode 
         WHEN 'MTD' 
         THEN DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) + 1, 0) 
         WHEN 'YTD' 
         THEN DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0) 
         WHEN 'QTD' 
         THEN DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) + 1, 0) 
         WHEN 'WTD' 
         THEN DATEADD(wk, DATEDIFF(wk, 0, GETDATE()) + 1, 0) 
         END; 

     SELECT Week# 
       , CustCateg 
       , ClntGroup 
       , CORD_DocumentCode 
       , DESP_DocumentCode 
       , Cord_Lines 
       , CORD_Qty 
       , DESP_Lines 
       , DESP_Qty 
       , Status 
       , d_status 
       , OpenDate 
       , DateDue 
       , DESP_PostedDate 
       , DocType 
       , [Lead times] 
       , InFxO 
       , OnTxO 
       , InFxO + OnTxO AS InFullAndOneTime 
     FROM (

      SELECT DATEPART(ISO_WEEK, d.DateOpn) AS Week# 
        , Clients.CustCateg 
        , Clients.ClntGroup 
        , d.DocumentCode AS CORD_DocumentCode 
        , CDSPDocs.DocumentCode AS DESP_DocumentCode 
        , COUNT(CORDLines.Qnty) AS Cord_Lines 
        , SUM(CORDLines.Qnty) AS CORD_Qty 
        , COUNT(CDSPLines.Qnty) AS DESP_Lines 
        , SUM(CDSPLines.Qnty) AS DESP_Qty 
        , CDSPLines.Status 
        , d.Status AS d_status 
        , d.OpenDate 
        , d.DateDue 
        , CDSPDocs.PostDate AS DESP_PostedDate 
        , d.DocType 
        , DATEDIFF(DAY, d.OpenDate, d.DateDue) AS [Lead times] 

     --in-full 
        , CASE WHEN SUM(CORDLines.Qnty) = SUM(CDSPLines.Qnty) THEN 1 
         ELSE 0 
        END AS InFxO 
     --On-Time by order according to Despatch SLAs 
        , CASE WHEN (Clients.ClntGroup IN ('Local Market', 
                 'Local Market - Pharm', 
                 'Web Sales - Local', 
                 'Web Sales - Export', 
                 'Mail Order', 
                 'Mail Order - Export')) 
           AND (DATEDIFF(DAY, d.OpenDate, CDSPDocs.PostDate) 
            - (DATEDIFF(WEEK, d.OpenDate, 
               CDSPDocs.PostDate) * 2) <= 2) 
         THEN 1 
         WHEN (Clients.ClntGroup = 'Export Market') 
           AND (DATEDIFF(DAY, d.OpenDate, CDSPDocs.PostDate) 
            - (DATEDIFF(WEEK, d.OpenDate, 
               CDSPDocs.PostDate) * 2) <= 14) 
         THEN 1 
         WHEN (Clients.ClntGroup = 'Export Market') 
           OR Clients.CustCateg = 'UK Transfer' 
           AND (d.DateDue >= CDSPDocs.PostDate) THEN '1' 
         ELSE 0 
        END AS OnTxO 
      FROM dbo.Documents AS d 
        INNER JOIN dbo.Clients ON d.ObjectID = dbo.Clients.ClntID 
               AND Clients.ClientName <> 'Samples - Free/Give-aways' 
        LEFT OUTER JOIN dbo.DocumentsLines AS CORDLines ON d.DocID = CORDLines.DocID 
                    AND CORDLines.TrnType = 'L' 
        LEFT OUTER JOIN dbo.DocumentsLines AS CDSPLines ON CORDLines.TranID = CDSPLines.SourceID 
                    AND CDSPLines.TrnType = 'L' 
                    AND (CDSPLines.Status = 'Posted' 
                    OR CDSPLines.Status = 'Closed' 
                   ) 
        LEFT OUTER JOIN dbo.Documents AS CDSPDocs ON CDSPLines.DocID = CDSPDocs.DocID 
      WHERE (d.DocType IN ('CASW', 'CORD', 'MORD')) 
        AND (CORDLines.LneType NOT IN ('Fght', 'MANF', 'Stor', 
                'PACK', 'EXPS')) 
        AND d.DateOpn >= @StartDate 
        AND d.DateOpn < @EndDate 
        AND (CORDLines.LneType IS NOT NULL) 
        AND (d.DateDue <= CONVERT(date, GETDATE(), 101)) 
      GROUP BY d.DateOpn 
        , d.DocumentCode 
        , Clients.CustCateg 
        , CDSPDocs.DocumentCode 
        , d.Status 
        , d.DocType 
        , d.OpenDate 
        , d.DateReq 
        , CDSPDocs.PostDate 
        , CDSPLines.Status 
        , Clients.ClntGroup 
        , d.DocumentName 
        , d.DateDue 
        , d.DateOpn 
     ) AS derived_table 
     ORDER BY d.DateOpn 
       , Week#; 
    END; 
GO 
+0

谢谢,它的作品就像一个魅力! – Eric 2014-10-18 07:21:26