【问题标题】:Use a variable instead of UNION query使用变量而不是 UNION 查询
【发布时间】:2014-03-24 16:48:20
【问题描述】:

我正在尝试使用可变条件编写查询。有没有办法在不使用联合的情况下执行以下操作,而是使用另一个表中的日期列表?

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

我在下面的 cmets 中提到,我希望将日期“2014-03-04”更改为保存在 #DATES 表中的日期列表。例如,如果日期

感谢到目前为止大家的帮助 - 感觉我们正在取得进展!

谢谢,山姆

【问题讨论】:

  • 我想要做的是用另一个表中的日期列表替换日期(2014-03-03、2014-03-04 等)。
  • 例如,在上面的查询中,第一个查询返回 32 个帐户,日期为

标签: sql sql-server sql-server-2008


【解决方案1】:
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

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

【讨论】:

  • 正确的逻辑会考虑原始查询中的条件:T2.SnapshotDate &lt;= '2014-03-04'
  • 我不明白如何将 '2014-03-03' 作为变量 - 我不想硬编码。
  • 同样在第一个示例中,子查询 T2.SnapshotDate 如何连接回#Table_1?
  • 好的。我已将第一个查询示例更改为包含单个日期变量,并更新了 INNER JOIN 子句。联接现在可以找到您感兴趣的日期的所有行。删除整个 INNER JOIN 语句并简单地在 GROUP BY 上方包含一个 WHERE 语句可能更容易: WHERE T2.SnapshotDate
  • 你能看看我的编辑,因为我已经粘贴在我现在拥有的代码中,并进一步描述了我正在努力实现的目标,以尝试让事情变得更清晰!非常感谢您迄今为止的帮助!
猜你喜欢
  • 2019-09-18
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 2021-09-24
相关资源
最近更新 更多