【问题标题】:SQL Insert into table variable as aliasSQL作为别名插入表变量
【发布时间】:2017-04-27 20:42:19
【问题描述】:

SQL 警报的新功能!

我已经声明了一个表变量并做了一个标准

Insert into @table
(
    columns
)
select (acquired data result)

我计划按月进行年度数据比较(例如比较今年 4 月和去年 4 月的数据)。由于我不想创建具有相同结构的单独表,除非我绝对必须这样做,所以这是我的问题:

是否可以在同一个临时表中插入不同的数据集作为别名来区分两者?

喜欢,例如

(Insert into @table
(
    columns
)
select (acquired data 1 result)) as alias1

(Insert into @table
(
    columns
)
select (acquired data 2 result)) as alias2

【问题讨论】:

  • 注意:这是一个表变量,而不是一个临时表。临时表是create table #temptablename ...——另外,你的问题的简短回答是:不是那样的。您拥有的别名只是您从中选择的来源的别名。
  • 您可以使用 INSERT 语句将任何列放入任何其他列,只要它们具有兼容的数据类型。如果您的数据每年都具有相同的结构,那么为什么不向您的表变量添加某种标识符,例如时间戳或日期范围,以便您可以知道数据的来源并准确过滤。例如,您可以使用 DATEPART(MM, [myDateField]) = 4 获取刚刚 4 月的数据。
  • @SqlZim 谢谢,相应地编辑了我的问题
  • @EMUEVIL 我现在就试试...
  • @SqlZim 即使我将谁的插入语句括在括号中?

标签: sql sql-server sql-insert


【解决方案1】:

为了将一个月的数据与上一年的同月进行比较的既定目的……您也许可以使用common table expressions 而不是表变量。

例如

;with PriorYear as (
  select ...
  from ...
  where ...
)
, CurrentYear as (
  select ...
  from ...
  where ...
)
select ...
from PriorYear 
  inner join CurrentYear 
    on ...

可能有很多比这更好的方法,它只是取决于你正在做什么样的比较和操作。

如果表变量中有不止一行,最好使用实际的临时表而不是表变量。

参考:

【讨论】:

  • @VadzimSavenok 很高兴为您提供帮助!
【解决方案2】:

如果您想将一个月的数据与过去一年的所有月份进行比较,您只需要某种时间戳字段,您可以按年份分组并按月份过滤。您可以使用以下内容来适应您的示例。

SELECT COUNT(*) AS [SomeAggregateFunction]
    , DATEPART(YEAR, [myTimestamp]) AS [Year]
FROM [myTable]
WHERE DATEPART(MM, [myTimestamp]) = 12
GROUP BY DATEPART(YEAR, [myTimestamp])

这将仅显示“十二月”的结果并按年份对信息进行分组。您可以使用任何类型的聚合函数来获取有用的信息,例如“SUM()”或“MAX()”,而不是我的“COUNT(*)”。什么时候有用的一个很好的例子是确定每年在某个月份或某月下达的订单数量。或者,如果您想获得每年 12 月的销售额的总和。只需按照您认为合适的方式对其进行编辑。如果您需要帮助,请随时发表评论。

【讨论】:

  • @VadzimSavenok 就表变量而言。如果您只想比较表中已经存在的数据,我认为您不需要制作一个。如果您想对其执行其他更复杂的功能,那么也许可以,但只需报告多年来的每月使用情况就可以完成,而无需创建任何类型的表变量或临时表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 2016-01-29
相关资源
最近更新 更多