【问题标题】:Split a single row in multi rows - SQL Server Management Studio 2018将单行拆分为多行 - SQL Server Management Studio 2018
【发布时间】:2019-07-17 06:26:20
【问题描述】:

我试图将单行拆分为多行但没有成功。任何帮助或提示将不胜感激。

表结构

结果

【问题讨论】:

  • 到目前为止您尝试了哪些方法,为什么它们不起作用? SO上有很多此类事情的示例,您查看了哪些示例,您不理解这些示例,或者没有按您预期的那样工作?另外,请不要将示例数据作为图像发布;这对您寻求帮助的志愿者没有用。数据应以text 或DDL 和DML 语句的格式提供。谢谢。
  • @Larnu 我在 SQL Server 中是全新的。老实说,我搜索“将单行拆分为多行”,有很多示例,但我没有应用解决方案的基本知识。
  • 由于您是 SQL Server 的新手(以及通常出现的数据库),让我给您一些建议:从基础开始。看看“规范化”(第一范式等),从长远来看,这将对您有所帮助。第一列包含日期、主队和客队,这是一列中的三个不同数据项。

标签: sql-server tsql unpivot


【解决方案1】:

您使用UNPIVOT。只需将列转换为最大的类型并应用它。像这样的:

DECLARE @DataSource TABLE
(
    [Dat_Cha_hOME_Away] VARCHAR(32)
   ,[Date] DATE
   ,[Half_Time_Score] VARCHAR(8)
   ,[Half Time_Goal Scored] CHAR(1)
   ,[Half Time_Goal Conceded] CHAR(1)
   ,[Half_Time_Both Teams Scored] CHAR(1)
);

INSERT INTO @DataSource 
VALUES ('2019_...italy01', '2019-03-24', '0-1', 'N', 'Y', 'N')
      ,('2019_...italy02', '2019-03-24', '2-1', 'Y', 'Y', 'Y')
SELECT *
FROM 
(
    SELECT [Dat_Cha_hOME_Away]
          ,CONVERT(VARCHAR(10), [Date], 121) AS [Date]
          ,CAST([Half_Time_Score] AS VARCHAR(10)) AS [Half_Time_Score]
          ,CAST([Half Time_Goal Scored] AS VARCHAR(10)) AS [Half Time_Goal Scored]
          ,CAST([Half Time_Goal Conceded] AS VARCHAR(10)) AS [Half Time_Goal Conceded]
          ,CAST([Half_Time_Both Teams Scored] AS VARCHAR(10)) AS [Half_Time_Both Teams Scored]
    FROM @DataSource
) DS
UNPIVOT
(
    [value] FOR [column] IN ([Date], [Half_Time_Score], [Half Time_Goal Scored], [Half Time_Goal Conceded], [Half_Time_Both Teams Scored])
) UNPVT;

【讨论】:

    【解决方案2】:

    根据@gotqn 的回答,我设法创建了自己的答案,并获得了理想的结果。非常感谢提供有用指南和提示的人。

    INSERT INTO Ins_Match_Details
    SELECT
           [Dat_Cha_Team] + '_' + Results_Type AS [Dat_Cha_Team_Res Typ]
         , [Date]
         , [Championship]
         , [Dat_Cha_Hom_Vs_Away]
         , [Team]
         , [Site]
         , CAST(Results_Type AS NVARCHAR(20))
         , CAST(Results_Value AS NVARCHAR(10))
    from
           (
                  SELECT
                         [Dat_Cha_Team]
                       , [Dat_Cha_Hom_Vs_Away]
                       , [Date]
                       , [Championship]
                       , [Team]
                       , [Site]
                       , [Half Time Score]
                       , CAST([Half Time_Goal Scored] AS NVARCHAR(180)) AS [Half Time_Goal Scored]
                       , CAST([Half Time_Goal Conceded] AS NVARCHAR(180)) AS [Half Time_Goal Conceded]
                       , CAST([Half Time_Both Teams Scored] AS NVARCHAR(180)) AS [Half Time_Both Teams Scored]
                       , CAST([Half Time_Over 0.5] AS NVARCHAR(180)) AS [Half Time_Over 0.5]
                       , CAST([Half Time_Over 1.5] AS NVARCHAR(180)) AS [Half Time_Over 1.5]
                       , CAST([Half Time_Result] AS NVARCHAR(180)) AS [Half Time_Result]
                       , [Full Time Score]
                       , CAST([Full Time_Goal Scored] AS NVARCHAR(180)) AS [Full Time_Goal Scored]
                       , CAST([Full Time_Goal Conceded] AS NVARCHAR(180)) AS [Full Time_Goal Conceded]
                       , CAST([Full Time_Both Teams Scored] AS NVARCHAR(180)) AS [Full Time_Both Teams Scored]
                       , CAST([Full Time_Over 0.5] AS NVARCHAR(180)) AS [Full Time_Over 0.5]
                       , CAST([Full Time_Over 1.5] AS NVARCHAR(180)) AS [Full Time_Over 1.5]
                       , CAST([Full Time_Over 2.5] AS NVARCHAR(180)) AS [Full Time_Over 2.5]
                       , CAST([Full Time_Result] AS NVARCHAR(180)) AS [Full Time_Result]
                  FROM
                         [Soccer_DatabASe].[dbo].[Imd_Match_Details]
           )
           [Imd_Match_Details] UNPIVOT (Results_Value FOR Results_Type in ([Half Time_Goal Scored]
                                                                         , [Half Time_Goal Conceded]
                                                                         , [Half Time_Both Teams Scored]
                                                                         , [Half Time_Over 0.5]
                                                                         , [Half Time_Over 1.5]
                                                                         , [Half Time_Result]
                                                                         , [Full Time_Goal Scored]
                                                                         , [Full Time_Goal Conceded]
                                                                         , [Full Time_Both Teams Scored]
                                                                         , [Full Time_Over 0.5]
                                                                         , [Full Time_Over 1.5]
                                                                         , [Full Time_Over 2.5]
                                                                         , [Full Time_Result]) ) AS ScoresUnpivot
    WHERE
           [Dat_Cha_Team] + '_' + Results_Type NOT IN
           (
                  SELECT
                         [Dat_Cha_Tea_Res Typ]
                  FROM
                         [Soccer_Database].[dbo].[Ins_Match_Details]
           )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-21
      • 2018-02-14
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多