2014-03-24 78 views
2

我正在嘗試使用變量條件編寫查詢。反正有沒有使用Union而不是使用Union,而是在另一個表中使用日期列表?使用變量而不是UNION查詢

SELECT 
'2014-03-03' AS SnapshotDate 
,T2.Pre_PPI_Cycle 
,SUM(ISNULL(T2.Pre_PPI_Balance, 0))AS Pre_Balance 
,COUNT(ISNULL(T2.Account_Number, 0)) AS Pre_Volume 
,ROW_NUMBER() OVER (PARTITION BY Account_Number 
ORDER BY Account_Number, SnapshotDate DESC) AS ROW 
FROM #TABLE_1 AS T2 
WHERE T2.SnapshotDate <= '2014-03-03' 
GROUP BY T2.SnapshotDate, T2.Pre_PPI_Cycle, Account_Number 
UNION 
SELECT 
'2014-03-04' AS SnapshotDate 
,T2.Pre_PPI_Cycle 
,SUM(ISNULL(T2.Pre_PPI_Balance, 0))AS Pre_Balance 
,COUNT(ISNULL(T2.Account_Number, 0)) AS Pre_Volume 
,ROW_NUMBER() OVER (PARTITION BY Account_Number 
ORDER BY Account_Number, SnapshotDate DESC) AS ROW 
FROM #PPI_3 AS T2 
WHERE T2.SnapshotDate <= '2014-03-04' 
GROUP BY T2.SnapshotDate, T2.Pre_PPI_Cycle, Account_Number 

編輯

感謝您的幫助,到目前爲止 - 只是爲了澄清 - 這是代碼我現在有。

SELECT 
T2.Capture_Date 
,T1.Pre_PPI_Cycle 
,SUM(ISNULL(T1.Pre_PPI_Balance, 0))AS Pre_Balance 
,COUNT(ISNULL(T1.Account_Number, 0)) AS Pre_Volume 
,ROW_NUMBER() OVER (PARTITION BY T1.Account_Number 
ORDER BY T1.Account_Number, T1.SnapshotDate DESC) AS ROW 
FROM 
#PPI_3 AS T1 
INNER JOIN (SELECT CHILD.Capture_Date 
FROM #DATES AS CHILD 
WHERE CHILD.Capture_Date <= '2014-03-04') T2 
ON T2.Capture_Date = T1.SnapshotDate 
GROUP BY T2.Capture_Date, T1.SnapshotDate, T1.Pre_PPI_Cycle, T1.Account_Number 

我在我要找更改日期「2014年3月4日」,其保持在表#DATES日期列表的評論如下。例如,如果日期< ='2014-03-03'則返回32條記錄。如果日期< ='2014-03-04'則返回55條記錄。我想要的是總查詢返回87條記錄。這是我正在努力的部分!

感謝大家的幫助 - 感覺我們正在取得進展!

謝謝,山姆

+0

我想要做的是用另一個表中的日期列表替換日期(2014-03-03,2014-03-04等) 。 – user3456377

+0

例如在上述查詢中,第一個返回日期<='2014-03-03'的32個帳戶,然後第二個查詢返回55個帳戶,其中日期<='2014-03-04'所以我想要該查詢總共返回87行。那可能嗎? – user3456377

回答

0
DECLARE @mydate smalldatetime 

set @mydate = '2014-03-03'; 

SELECT 
    '2014-03-03' AS SnapshotDate 
    ,T2.Pre_PPI_Cycle 
    ,SUM(ISNULL(T2.Pre_PPI_Balance, 0))AS Pre_Balance 
    ,COUNT(ISNULL(T2.Account_Number, 0)) AS Pre_Volume 
    ,ROW_NUMBER() OVER (PARTITION BY Account_Number ORDER BY Account_Number, SnapshotDate  DESC) AS ROW 
FROM #TABLE_1 AS T2 
INNER JOIN (SELECT T2.ID, myDate 
      FROM #TABLE_1 AS T2 
      WHERE T2.SnapshotDate <= @mydate 
      ) x 
      ON x.myDate = T2.SnapshotDate 
      AND x.ID = T2.ID 
GROUP BY T2.SnapshotDate, T2.Pre_PPI_Cycle, Account_Number 

OR

SELECT 
    '2014-03-03' AS SnapshotDate 
    ,T2.Pre_PPI_Cycle 
    ,SUM(ISNULL(T2.Pre_PPI_Balance, 0))AS Pre_Balance 
    ,COUNT(ISNULL(T2.Account_Number, 0)) AS Pre_Volume 
    ,ROW_NUMBER() OVER (PARTITION BY Account_Number ORDER BY Account_Number, SnapshotDate DESC) AS ROW 
FROM #TABLE_1 AS T2 
WHERE T2.SnapshotDate IN (SELECT myDate 
      FROM #TABLE_1 AS T2 
      WHERE T2.SnapshotDate <= '2014-03-03') 
GROUP BY T2.SnapshotDate, T2.Pre_PPI_Cycle, Account_Number 

根據您的最新更新。我會做以下,因爲它更容易:

SELECT 
T1.Capture_Date 
,T1.Pre_PPI_Cycle 
,SUM(ISNULL(T1.Pre_PPI_Balance, 0))AS Pre_Balance 
,COUNT(ISNULL(T1.Account_Number, 0)) AS Pre_Volume 
,ROW_NUMBER() OVER (PARTITION BY T1.Account_Number 
ORDER BY T1.Account_Number, T1.SnapshotDate DESC) AS ROW 
FROM #PPI_3 AS T1 
WHERE T1.Capture_Date IN ( 
    SELECT CHILD.Capture_Date 
    FROM #DATES AS CHILD 
    WHERE CHILD.Capture_Date <= '2014-03-04') 
GROUP BY T1.Capture_Date, T1.SnapshotDate, T1.Pre_PPI_Cycle, T1.Account_Number 
+0

正確的邏輯會考慮原始查詢中的條件:'T2.SnapshotDate <='2014-03-04'。 –

+0

確實。答案已更新。 – sarin

+0

我不明白的是如何將'2014-03-03'作爲變量 - 我不想將它硬編碼。 – user3456377