【问题标题】:Database years and tables数据库年份和表格
【发布时间】:2014-04-16 23:10:45
【问题描述】:

我有一个包含 3 个表的数据库 ArtNrYearPrice

`select * from database` 

会给这样的东西

ArtNr     - Year - Price
------------------------    
601230001 - 2011 - 100
601230001 - 2012 - 110
601230001 - 2013 - 105
604560001 - 2012 - 250
604560001 - 2013 - 225

我怎样才能得到类似的结果

ArtNr     - 2011 - 2012 - 2013
------------------------------    
601230001 -  100 -  110 -  105
604560001 - NULL -  250 -  225

【问题讨论】:

  • 这样的转换称为Pivot table。如何实现这一点很大程度上取决于您的数据库系统。你用的是哪个?
  • 嗨,我使用的是 MS SQL-server 2008

标签: sql database sql-server-2008


【解决方案1】:
SELECT  ArtNr,
        MIN(CASE WHEN Year = 2011 THEN Price END) Year2011,
        MIN(CASE WHEN Year = 2012 THEN Price END) Year2012,
        MIN(CASE WHEN Year = 2013 THEN Price END) Year2013
FROM YourTable
GROUP BY ArtNr

【讨论】:

  • 是的,只要 ArtNrYear 的每个组合恰好有一行,这应该可以工作。
  • 如果我使用这样的选择,我将不得不每年更改查询...我更多的是寻找未来几年的查询:D
  • @user3541595 然后在这里快速搜索“sql-server dynamic pivot”,你会得到数百个处理这个问题的答案
  • 我不知道 Pivot,所以这个菜鸟会读一些关于 Pivot 的文章
【解决方案2】:

这里需要一个数据透视表(在 access/excel 中称为“交叉表”)。我们可以用一些 case 语句对 select 进行硬编码以涵盖固定的年数,但是每次添加或删除一年时都必须重新访问该解决方案。 @Lamak 在下面有这样的解决方案。

或者,如果我有能力(而且我从来没有这样做过),我会切换数据库引擎。以下是三个提供创建数据透视表工具的数据库引擎:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多