【发布时间】:2023-04-10 09:04:01
【问题描述】:
我的数据在“正常”查询中会如下所示:
Val1 Val2
---- ----
1 2
2 [blank]
3 2
4
5 1
6 3
..
96 1
不过,我想要的是这样的(我需要将行数限制为 12):
Val1 Val2 Val1 Val2 Val1 Val2 ... Val1 Val2
---- ---- ---- ---- ---- ----
1 2 13 1 25 [blank] ... 85 1
2 [blank] 14 1 26 3 ... 86 [blank]
.. ... ... ... ... ... ... ... ...
12 1 24 [blank] 36 2 ... 96 3
是否有一个 select 语句可以给我这个?我不是 SQL 专家,但我在想一些事情(语义上)沿着这些思路:
select (select val1, val2 from dbtable where val1 < 13),
(select val1, val2 from dbtable where val1 > 12 and val1 < 25),
...
(select val1, val2 from dbtable where val1 > 84)
from dbtable
更新
响应dfb的sql示例:
当我这样做时:
SELECT t1.Val1, t1.Val2 FROM
(SELECT Val1, Val2, rownum() as rownum FROM dbTable) t1
INNER JOIN (SELECT Val1, Val2, rownum() as rownum FROM dbTable) t2
ON t1.rownum/2 == t2.rownum/2
...我得到 “FROM 关键字未在预期的位置找到”
当我这样做时(删除“rownum()”的东西):
SELECT t1.Val1, t1.Val2 FROM
(SELECT Val1, Val2 FROM dbTable) t1
INNER JOIN (SELECT Val1, Val2 FROM dbTable) t2
ON t1.rownum/2 == t2.rownum/2
...我得到 "ORA-01747: 无效的 user.table.column、table.column 或列 规范"
更新 2
Sully 的例子是最接近的,虽然我希望 UNION SQL 能够工作 - 如果它可以在不按下有效值的情况下完成会更好。事实上,我有正确的布局,但 val 并没有出现在 16X12 布局中我需要它们的位置。无论如何,为了后代的缘故,下面是动态创建行和列的方式(不是如下代码所示,并且彼此不完全相同):
//prebuild 12 rows in outputDt
int iRows = 12;
while (iRows > 0)
{
DataRow row = outputDt.NewRow();
outputDt.Rows.Add(row);
iRows -= 1;
}
//prebuild 16 cols in outputDt
int iCols = 16;
while (iCols > 0) {
DataColumn col = new DataColumn();
outputDt.Columns.Add(col);
iCols -= 1;
}
最终更新
搞定了。见Is it possible to populate a DataGridView with alternating vertical columns?
【问题讨论】:
-
有趣的问题...请问输出将用于什么?在我看来,这应该通过代码中的格式化逻辑而不是 SQL 来处理。
-
是的,如果列名对于所有后续列都将保留 Val1 和 Val2,那么这是一个格式问题,应该在显示逻辑中处理。否则你可能需要阅读透视技术
-
@BLSully:这将在 DataGridView (C# Winforms) 中呈现。垂直呈现数据是有问题的。我认为从 git-go 中获取所需形式的数据会容易得多。
-
@ClearLogic:我不关心标题/标题;事实上,它们将是不可见的;只有数据本身应该显示在 DataGridView 中。