【问题标题】:Unpivot a single into two rows - T-SQLUnpivot 一个成两行 - T-SQL
【发布时间】:2020-07-22 21:05:28
【问题描述】:

我正在尝试取消旋转下面的行,但我遇到了麻烦。有什么帮助吗?

输入:

Date        Time    Country_Championship    Game      Home_Team   Away_Team
----------------------------------------------------------------------------
19/07/2020  18:45   Albania: Superliga  Bylis Vs Laci   Bylis       Laci

输出:

Date        Time    Country_Championship    Game        Team
---------------------------------------------------------------
19/07/2020  18:45   Albania: Superliga  Bylis Vs Laci   Bylis
19/07/2020  18:45   Albania: Superliga  Bylis Vs Laci   Laci

我尝试过的:

SELECT 
    u.[Date], u.[Time], 
    u.[Country_Championship],
    u.[Game],
    u.[Home_Team], u.[Away_Team],
    u.details
FROM 
    [Soccer_Analytics].[dbo].[Ins_UpcomingGames_Temp] t
UNPIVOT
    (details FOR [Date], [Time], [Country_Championship], [Game] IN ([Home_Team], [Away_Team])) u;

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。

标签: sql-server tsql join unpivot


【解决方案1】:

在 T-SQL 中,我建议为此使用横向连接:

select x.*
from [Soccer_Analytics].[dbo].[Ins_UpcomingGames_Temp] t 
cross apply (values
    (date, time, country_championship, game, home_team),
    (date, time, country_championship, game, away_team)
) as x(date, time, country_championship, game, team)

【讨论】:

  • 感谢您的回答。另一个想法是创建两个 CTE 并将它们合并。您对此有何看法?
  • @Error1004: cross apply 效率更高,因为它只扫描一次表,而union all 需要两次扫描。
  • 非常感谢您提供的信息。 Union All 获取站点的所有内容,Union 仅获取不同的行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 2022-01-18
  • 2022-01-18
相关资源
最近更新 更多