SQL Pivot на нескольких столбцах - PullRequest
0 голосов
/ 09 января 2019

У меня есть запрос, где я вывожу коэффициенты и результаты футбола:

SELECT
    Div, BookieResult, COUNT(BookieResult) AS WinLossCount, OddsCategory
FROM 
    [dbo].[MatchOutcomes]
GROUP BY
    div, OddsCategory, BookieResult

Возвращает результат, подобный следующему:

enter image description here

Я ищу результаты, в которых данные более читабельны, и каждый лайк находится в одной строке, например:

enter image description here

Я пытался поворачивать данные разными способами, но, похоже, не могу получить их в SQL. Кто-нибудь знает, можно ли выполнить макет выше?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 09 января 2019
;WITH Table AS
(
  Select Div, BookieResult, Count(BookieResult) as WinLossCount, 
  OddsCategory
  FROM [dbo].[MatchOutcomes]
  group by div, OddsCategory, BookieResult
)
select Res1.Div
           ,Res1.[Loss]
           ,Res1.[Win]
           ,Res1.[oddscategory]
           ,Res2.[Loss]
           ,Res2.[Win]
           ,Res2.[oddscategory]
           ,Res3.[Loss]
           ,Res3.[Win]
           ,Res3.[oddscategory] 
           ,Res4.[Loss]
           ,Res4.[Win]
           ,Res4.[oddscategory]
    from
    (
    select Div
               ,[Loss]
               ,[Win]
               ,[oddscategory]
        from Table
        pivot
        (
             max(winlosscount)
             for BookResult IN ([Loose],[Win])
        )Rs1
        where oddscategory = 0 
     )Res1
    LEFT JOIN
    (
    select Div
               ,[Loss]
               ,[Win]
               ,[oddscategory]
        from Table
        pivot
        (
             max(winlosscount)
             for BookResult IN ([Loose],[Win])
        )Rs2
        where oddscategory = 1 
     )Res2 ON Res2.Div = Res1.Div
    LEFT JOIN
    (
    select Div
               ,[Loss]
               ,[Win]
               ,[oddscategory]
        from Table
        pivot
        (
             max(winlosscount)
             for BookResult IN ([Loose],[Win])
        )Rs3
        where oddscategory = 2 
     )Res3 Res3.Div = Res1.Div
    LEFT JOIN
    (
    select Div
               ,[Loss]
               ,[Win]
               ,[oddscategory]
        from Table
        pivot
        (
             max(winlosscount)
             for BookResult IN ([Loose],[Win])
        )Rs4
        where oddscategory = 3 
     )Res4 Res4.Div = Res1.Div
0 голосов
/ 09 января 2019

удалось получить его. Спасибо за помощь, ребята, они привели меня в правильном направлении

  select * from (
  Select Div, CONCAT(BookieResult,OddsCategory) as [fg], Count(BookieResult) as 
  WinLossCount
  FROM [dbo].[MatchOutcomes]
  group by div, OddsCategory, BookieResult) as s
  PIVOT
  (
  SUM(WinLossCount)
  FOR [fg] IN (
  Lose0,
Win0,
Lose1,
Win1,
Lose2,
Win2,
Lose3,
Win3)
) AS PVT
order by div desc

Окончательный результат

0 голосов
/ 09 января 2019

Я попробовал, как показано ниже, так как у вас есть две нечетные модификации от вашего текущего к желаемому o / p, это BookieResult<br> (Loss/Win), а последним будет OddsCategory as(0,1,2,3), аналогично развернутый только на эти столбцы для отражения тока. надеюсь, что это работает для вас.

       Select Div, BookieResult, 
       WinLossCount, OddsCategory from
        (Select Div, BookieResult, Count(BookieResult) as 
       WinLossCount, OddsCategory
      FROM [dbo].[MatchOutcomes]
      group by div, OddsCategory, BookieResult)

        PIVOT
          (
   Count(BookieResult) as 
     WinLossCount, OddsCategory
   for OddsCategory IN (0,1,2,3) And 
      BookieResult IN ("Loss","Win")
     )

   )
...