【问题标题】:Alternating Columns of 2 SQL Queries2 个 SQL 查询的交替列
【发布时间】:2016-02-29 12:26:19
【问题描述】:

我有一个 oracle 查询,它从两个不同的表中获取数据,并将它们显示为:

Project | 20151 | 20152 | 20153 | 20154 | Project_1 | 20151_1 | 20152_1 | 20153_1 | 20154_1
-------------------------------------------------------------------------------------------

这确实得到了我需要的正确数据,但是我需要一种交替每个表中的列的方法。例如:

Project | Project_1 | 20151 | 20151_1 | ...
---------------------------------------

我的查询如下:

SELECT * FROM(
  SELECT * FROM 
  (
    SELECT planned.YEAR || planned.MONTH as AAA, planned.DAYS as Amount, PROJ.NAME AS Project 
    FROM PLANNED_RESOURCE_TAB planned, USER_LINK_VIEW PROJ
    WHERE ACTUAL.U_P_LINK = PROJ.ID 
    AND PROJ.USER_ID = '1' 
  ) 
  PIVOT
  ( 
    SUM(Amount) FOR AAA in (20151,20152,20153,20154)
  )
) 
PLANNED__ RIGHT OUTER JOIN
(
  SELECT * FROM 
  (
    SELECT ACTUAL.YEAR || ACTUAL.MONTH as BBB, ACTUAL.DAYS as Amount, PROJ.NAME AS Project 
    FROM ACTUAL_RESOURCE_TAB actual, USER_LINK_VIEW PROJ
    WHERE ACTUAL.U_P_LINK = PROJ.ID 
    AND PROJ.USER_ID = '1' 
  )
  PIVOT
  ( 
    SUM(Amount) FOR BBB in (20151,20152,20153,20154)
  ) 
)ACTUAL__
ON PLANNED__.PROJECT = ACTUAL__.PROJECT

数据结果会显示在一个 ASP.NET 页面上,所以如果最好在页面本身上操作列是没有问题的。我主要想知道是否可以事先用 SQL 来做,以及随后我将如何去做。

不能在第一个 select 语句中声明这些列,它们将根据用户输入而有所不同。枢轴内的值仅用于我的测试目的,它们将从 ASP.NET 页面动态生成。

提前致谢!

【问题讨论】:

  • 它有点属于页面。 SQL 并不是真正为数据表示而设计的,只是用于数据查询。在表现层做表现。
  • 有道理,感谢您的反馈。这纯粹是为了维护作品的结构,还是实际上也进行了优化?
  • 好吧,目的不是“优化性能”(在某些情况下它会有所帮助,在某些情况下会造成伤害,而在其他情况下则无关紧要)。一切都是为了在适合的地方做事——如果您发现需要对性能至关重要的优化,您总是可以打破所有模式(以某种合理的方式)。例如,让 DB 只返回字符串的前 10 个字符是完全合法的,如果这就是您在演示文稿(或 BL)中需要的全部内容,但在 SQL 中格式化日期时间值没有意义,或使用 UI 标题命名列。

标签: c# sql asp.net oracle


【解决方案1】:

您是否尝试将* 替换为最外部选择的检索列?像这样的:

SELECT PLANNED__.Project,
  ACTUAL__.Project,
  PLANNED__."20151",
  ACTUAL__."20151",
  PLANNED__."20152",
  ACTUAL__."20152",
  PLANNED__."20153",
  ACTUAL__."20153",
  PLANNED__."20154",
  ACTUAL__."20154"
FROM
  (SELECT *
  FROM
    (SELECT planned.YEAR
      || planned.MONTH AS AAA,
      planned.DAYS     AS Amount,
      PROJ.NAME        AS Project
    FROM PLANNED_RESOURCE_TAB planned,
      USER_LINK_VIEW PROJ
    WHERE ACTUAL.U_P_LINK          = PROJ.ID
    AND PROJ.USER_ID               = '1'
    ) PIVOT ( SUM(Amount) FOR AAA IN (20151,20152,20153,20154) )
  ) PLANNED__
RIGHT OUTER JOIN
  (SELECT *
  FROM
    (SELECT ACTUAL.YEAR
      || ACTUAL.MONTH AS BBB,
      ACTUAL.DAYS     AS Amount,
      PROJ.NAME       AS Project
    FROM ACTUAL_RESOURCE_TAB actual,
      USER_LINK_VIEW PROJ
    WHERE ACTUAL.U_P_LINK          = PROJ.ID
    AND PROJ.USER_ID               = '1'
    ) PIVOT ( SUM(Amount) FOR BBB IN (20151,20152,20153,20154) )
  )ACTUAL__
ON PLANNED__.PROJECT = ACTUAL__.PROJECT

【讨论】:

  • 这确实给出了我想要的确切结构,但问题是列会发生变化。它们代表日期,因此例如,如果用户想在 2014 年 6 月和 2014 年 12 月之间查看,则列需要是 20146、20147 等。我想我可以用 C# 构建查询字符串,并以这种方式有效地创建你的答案...不过谢谢!
猜你喜欢
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多