【问题标题】:Why is this SQL returning 15 rows instead of 12?为什么这个 SQL 返回 15 行而不是 12 行?
【发布时间】:2012-08-22 23:39:05
【问题描述】:

我需要以“电子表格”类型的方式显示数据库中的数据,值以垂直方式显示,而不是像通常那样水平显示为行。

网格需要正好是 16 列 x 12 行。在正常情况下,它将是两列,最多 96 行。

我从 ClearLogic 的答案中得出的查询:

Is there a SQL statement that will break what would be 2 long columns into several pairs of columns?

.. 非常接近,但它生成了 15 列,并两次添加了一些值。它看起来足够近,让我想继续沿着这条路走下去。

注意:Val1 始终是介于 1..96 之间的值

我的 sql(产生 16 列乘 15 行的结果集)是:

Select Val1 AS col1, Val2 AS col2,NULL AS Col3,NULL AS Col4 ,NULL AS 
Col5,NULL AS Col6,NULL AS col7,NULL AS Col8, NULL AS Col9, NULL AS Col10, NULL AS 
Col11, NULL AS Col12, NULL AS Col13, NULL AS Col14, NULL AS Col15, NULL AS Col16 
from PLATYPUSAVAILABILITY where Val1 < 13 and PLATYPUSID = 42
AND AVAILABLEDATE = to_date('20120823', 'yyyymmdd')

UNION select NULL AS col1,NULL AS col2,Val1 AS Col3, Val2 AS Col4,NULL 
AS Col5,NULL AS Col6,NULL AS col7,NULL AS Col8, NULL AS Col9, NULL AS Col10, NULL AS
Col11, NULL AS Col12, NULL AS Col13, NULL AS Col14, NULL AS Col15, NULL AS Col16 
from PLATYPUSAVAILABILITY where Val1 > 12 and Val1 < 25 and 
PLATYPUSID = 42 AND AVAILABLEDATE = to_date('20120823', 'yyyymmdd')

UNION select NULL AS col1,NULL AS col2 ,NULL AS Col3, NULL AS Col4,Val1 AS 
Col5, Val2 AS Col6,NULL AS col7,NULL AS Col8, NULL AS Col9, NULL AS Col10, NULL 
AS Col11, NULL AS Col12, NULL AS Col13, NULL AS Col14, NULL AS Col15, NULL AS Col16 
from PLATYPUSAVAILABILITY where Val1 > 24 and Val1 < 37 and 
PLATYPUSID = 42 AND AVAILABLEDATE = to_date('20120823', 'yyyymmdd')

UNION select NULL AS col1,NULL AS col2 ,NULL AS Col3, NULL AS Col4, NULL AS 
Col5, NULL AS Col6,Val1 AS col7,Val2 AS Col8, NULL AS Col9, NULL AS 
Col10, NULL AS Col11, NULL AS Col12, NULL AS Col13, NULL AS Col14, NULL AS Col15, 
NULL AS Col16 from PLATYPUSAVAILABILITY where Val1 > 36 and Val1 
< 49 and PLATYPUSID = 42 AND AVAILABLEDATE = to_date('20120823', 'yyyymmdd')

UNION select NULL AS col1,NULL AS col2 ,NULL AS Col3, NULL AS Col4,Val1 AS 
Col5,Val2 AS Col6,NULL AS col7,NULL AS Col8, Val1 AS Col9, Val2 AS 
Col10, NULL AS Col11, NULL AS Col12, NULL AS Col13, NULL AS Col14, NULL AS Col15, 
NULL AS Col16 from PLATYPUSAVAILABILITY where Val1 > 48 and Val1 
< 61 and PLATYPUSID = 42 AND AVAILABLEDATE = to_date('20120823', 'yyyymmdd')

UNION select NULL AS col1,NULL AS col2 ,NULL AS Col3, NULL AS Col4,NULL AS 
Col5,NULL AS Col6,NULL AS col7,NULL AS Col8, NULL AS Col9, NULL AS Col10, 
Val1 AS Col11, Val2 AS Col12, NULL AS Col13, NULL AS Col14, NULL AS 
Col15, NULL AS Col16 from PLATYPUSAVAILABILITY where Val1 > 60 and 
Val1 < 73 and PLATYPUSID = 42    AND AVAILABLEDATE = to_date('20120823', 'yyyymmdd')

UNION select NULL AS col1,NULL AS col2 ,NULL AS Col3, NULL AS Col4,NULL AS 
Col5,NULL AS Col6,NULL AS col7,NULL AS Col8, NULL AS Col9, NULL AS Col10, NULL AS 
Col11, NULL AS Col12, Val1 AS Col13, Val2 AS Col14, NULL AS Col15, NULL 
AS Col16 from PLATYPUSAVAILABILITY where Val1 > 72 and Val1 < 85 
and PLATYPUSID = 42 AND AVAILABLEDATE = to_date('20120823', 'yyyymmdd') 

UNION select NULL AS col1,NULL AS col2 ,NULL AS Col3, NULL AS Col4,NULL AS 
Col5,NULL AS Col6,NULL AS col7,NULL AS Col8, NULL AS Col9, NULL AS Col10, NULL AS 
Col11, NULL AS Col12, NULL AS Col13, NULL AS Col14, Val1 AS Col15, Val2 
AS Col16 from PLATYPUSAVAILABILITY where Val1 > 84 and PLATYPUSID = 42 
AND AVAILABLEDATE = to_date('20120823', 'yyyymmdd')

我怎样才能让它自己限制在 12 行而不是溢出到 15 行?

我在 TOAD 中运行此查询后看到的屏幕截图可以在以下位置看到:

http://warbler.posterous.com/so-close-and-yet-so-far-away-sqlizers-lament

应该只有 12 行,并且值应该从第 9 列和第 10 列的顶部开始,并溢出到第 11 列和第 12 列的一行(顶部)。

我使用 Datagridview 作为标签,因为这是数据的最终目标:datagridview1.DataSource = //查询结果为 OracleDataTable

更新

搞定了。见Is it possible to populate a DataGridView with alternating vertical columns?

【问题讨论】:

  • 我认为您需要发布源数据才能获得答案。虽然我想知道您是否需要将 96 * 2 元素 (192) 重新格式化为 16 x 12 (192) 元素显示,但创建一个具有 16 列的临时表会更简单(执行和维护),然后在其中插入非常具体的元素集?
  • 数据为:Val1 = 45..52, 54..60 而Val2都是3.IOW,15组值的排序:[45,3],[46,3] ,[47,3]...排除 [53,X]...[59,3][60,3]。我开始认为你是对的:使用 TableLayoutPanel 更容易......
  • 您的查询返回 15 行,因为以下查询返回 15 行(我猜):select * from PLATYPUSAVAILABILITY where PLATYPUSID = 42 AND AVAILABLEDATE = to_date('20120823', 'yyyymmdd')。如果您想这样做,则不需要所有unions。只需在单个选择中使用 case when val> 84 然后 val1 else null end`...

标签: sql oracle datagridview union


【解决方案1】:

我认为为什么显示错误的问题的答案源于您的数据。如果您有所有可能值为 Val1 的行,而当前没有 val1 的行的 Val2 为 null,我希望显示是正确的。我认为问题的出现是因为不存在需要(在我看来)存在以使格式正确的行。

我很欣赏这可能不会过于积极,因为无论如何您可能并不总是拥有 val1 的所有值 - 但有一种方法可以解决这个问题:

如果你创建一个从 1 到 96 的整数表,让我们调用这个 tblArray,那么你的 from 子句可以是:

 FROM tblArray t LEFT JOIN PlatypusAvailability p ON t.ID = p.Val1

& 应该可以完成这项工作。但我建议先在第一段测试我的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2023-02-24
    相关资源
    最近更新 更多