【问题标题】:Getting undesired output in SQL Server while using pivot使用数据透视时在 SQL Server 中获得不需要的输出
【发布时间】:2022-09-27 11:57:48
【问题描述】:

我正在寻找以下输出:

但得到这个:

我使用的两个表是Table 1Table 2

我也提供表格的链接Kaggle Dataset

我有的代码

SELECT * 
FROM   
    (SELECT
         nr.region, Medal, 
         COUNT(Medal) AS \'Total_Medal\' 
     FROM
         athlete_events AS ae
     JOIN
         noc_regions AS nr ON ae.NOC = nr.NOC
     WHERE
         Medal <> \'NA\'
     GROUP BY 
         Medal, nr.region) AS t1
PIVOT 
    (COUNT(Medal) 
         FOR Medal IN ([Gold], [Silver], [Bronze])
    ) pivot_table
ORDER BY
    Total_Medal DESC

请帮我解决这个问题,考虑我是新手

标签: sql sql-server pivot


【解决方案1】:

我想你可能只是想要这样的东西:

SELECT *
FROM (
 SELECT nr.region, medal
 FROM athlete_events ae INNER JOIN noc_regions nr
  ON ae.noc = nr.noc
 WHERE medal <> 'NA'
) t1
PIVOT(COUNT(medal) FOR medal in ([Gold], [Silver], [Bronze])) pt
ORDER BY gold+silver+bronze DESC

你内心的grouping 和counting 似乎没有任何理由。 pivot 可以处理计数,并且由于您不希望在输出中出现 total medal(订单除外),因此您可以对 ORDER BY 中的奖牌字段求和。

【讨论】:

    【解决方案2】:

    所以我有点放弃了自己的枢轴。过去给我带来了很多问题(当然总是我自己的错误),我什么时候可以尝试不同的方法。

    因此,我将向您展示一个查询,告诉您如何获得所需的结果,但它不会回答您的关键问题。这种方法不是最有效的,但它适合这些记录的大小,我认为它使查询更具可读性。

    SELECT 
        region
        , SUM(Gold) AS 'Gold'
        , SUM(Silver) AS 'Silver'
        , SUM(Bronze) AS 'Bronze'
    FROM
        noc_regions
        LEFT JOIN (SELECT NOC, COUNT(*) AS 'Gold' FROM athlete_events WHERE Medal = 'Gold' GROUP BY NOC) gold_events ON noc_regions.NOC = gold_events.NOC
        LEFT JOIN (SELECT NOC, COUNT(*) AS 'Silver' FROM athlete_events WHERE Medal = 'Silver' GROUP BY NOC) silver_events ON noc_regions.NOC = silver_events.NOC             
        LEFT JOIN (SELECT NOC, COUNT(*) AS 'Bronze' FROM athlete_events WHERE Medal = 'Bronze' GROUP BY NOC) bronze_events ON noc_regions.NOC = bronze_events.NOC
    GROUP BY
        region
    ORDER BY
        Gold DESC
        , Silver DESC
        , Bronze DESC
        , region ASC;
    

    【讨论】:

      【解决方案3】:

      试试这个,你会得到准确的输出

      Select OH.Region,
      Count(Case When O.Medal='Gold' Then 1 End) AS Gold,
      Count(Case When O.Medal='Silver' Then 1 End) AS Silver,
      Count(Case When O.Medal='Bronze' Then 1 End) AS Bronze
      from athlete_events O
      Join noc_regions OH On OH.NOC = O.NOC 
      Group by OH.Region
      Order By Gold Desc,Silver Desc,Bronze Desc
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-30
        • 1970-01-01
        • 1970-01-01
        • 2017-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多