【问题标题】:Normalize database (months by column)规范化数据库(按列月)
【发布时间】:2017-08-04 14:39:45
【问题描述】:

我有一个连接到 SQL(PERVASIVE) 的表,它为每个月输出一列。 为了在 Excel 中更好地工作,我需要将 12 列转换为只有 2 列... - 值的第一个; - 相应月份的第二个(此时,月份是列标题)。

举个例子,转一下当前的数据库结构:

Al_Cta     | MoedCod | TpVal   | FlagDC  | Month01 | Month02 | Month03
AAAAA      |     100 |      20 |        5|      15 |      18 |      16
BBBBB      |     200 |      40 |       10|      20 |      21 |      26
CCCCC      |     300 |      60 |       15|      40 |      48 |      41

理想的输出:

Al_Cta     |  MoedCod|TpVal | FlagDC  | Value   | Month
AAAAA      |     100 |    20|       5 |      15 |     01
AAAAA      |     100 |    20|       5 |      18 |     02
AAAAA      |     100 |    20|       5 |      16 |     03
BBBBB      |     200 |    40|      10 |      20 |     01
BBBBB      |     200 |    40|      10 |      21 |     02
BBBBB      |     200 |    40|      10 |      26 |     03
CCCCC      |     300 |    60|      15 |      40 |     01
CCCCC      |     300 |    60|      15 |      48 |     02
CCCCC      |     300 |    60|      15 |      41 |     03

我已经在论坛中获得了一些帮助,但我没有成功。 我使用以下命令,但是数据库根本没有改变,有人可以看看有什么问题吗?


SELECT * 
  FROM [IN16-CTAVAL]
Select p.Al_Cta ,MoedCod ,TpVal,FlagDC, 
       sale_quantity ,salemonths
  From products as p 
     inner join (    
         Select Al_Cta  ,sale_quantity ,salemonths from products
           UNPIVOT
      (
         salemonths for sale_quantity in (Month01 | Month02 | Month03) 
      )) as pp on p.Al_Cta = pp.Al_Cta

最好的问候!!!

【问题讨论】:

  • 您是在尝试更改此表的结构,还是在尝试查询现有表以检索显示格式的数据?
  • 您的 UNPIVOT 查询似乎是正确的,但它只是一个查询,因此不会更改任何内容。您可能想将其更改为 SELECT * INTO [NewTableName] FROM 等.....然后您可以查询 SELECT * FROM NewTableName 以获取新的数据格式...
  • 谢谢 Bob Jarvis 我正在尝试更改 SQL 输出表格的方式,即我正在尝试“理想的输出”是我在 Excel 中看到的唯一内容。 @Milney所以我将在Excel中有两个表格,对吗?当前的一张和一张新桌子。

标签: sql sql-server normalize


【解决方案1】:
select al_cta,
moedcod,
tpval,
flagdc,b.*
 from maintable
 cross apply
( 
values
 (month01,'01') ,
 (month02,'02') ,
 (month03,'03')
  ) 
 b(value,month)

如果你有更多的列,你可以在 values 子句中添加更多..

以上代码的工作方式是

cross apply 可以访问主表的行,并且您正在将它们转换为如下所示的列

values
(a,b),--row with two columns
(c,d)

所以上面的代码将对主表中的每一行进行评估,它将是主表 r1 中的行和值子句的输出的乘积。如下所示

Row1* value clause row1
Row1* value clause row2
Row1* value clause row3

and so  on

【讨论】:

  • 我没有投反对票,但就像您希望他们发表评论一样,您也应该在答案中添加一些解释。很有可能这就是投反对票的原因
  • 这不是动态的,因此仅适用于硬编码值...几乎不是解决方案。这个OP实际上在他的问题中有一个不重要的问题,这是正确的方法,他只是说它不会“更改数据库”所以我认为他只是想将它保存到一个表中......你的答案没有真的回答了这个问题,所以我也投了反对票
  • 感谢您投入的时间,但这不会提供动态且“随时可用”的表格,对吗?
猜你喜欢
  • 1970-01-01
  • 2012-10-08
  • 2012-06-21
相关资源
最近更新 更多