2014-10-16 232 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