在相邻列中组合SQL查询的结果

我知道这已经被问过,但是给出的解决scheme对我来说并不起作用。

我有几个查询(他们将总共42,但让我们尝试2这个例子)看着一个表,并返回不同条件的结果。 我怎样才能简单地把结果放在与SQL相邻的列中?

查询是:

SELECT Column5 as Alias1 FROM Table WHERE Column2 = 1 AND Column3 = 1 AND Column4 =1 SELECT Column5 as Alias2 FROM Table WHERE Column2 = 1 AND Column3 = 1 AND Column4 =2 

…(第2,3和4列中的所有值的组合恰好是42)

 SELECT Column5 as Alias42 FROM Table WHERE Column2 = 7 AND Column3 = 3 AND Column4 =3 

上述每个查询都按预期工作,并返回一列44行。 我想要做的就是查询返回结果在并排列(所以我需要42列,每行44行)。

有任何想法吗?

我已经尝试了以下内容:

基于此: 我如何将多个select语句组合在单独的列中?

 SELECT TMP1.Alias1,TMP2.Alias2 FROM (SELECT Column5 as Alias1 FROM Table WHERE Column2 = 1 AND Column3 = 1 AND Column4 =1) AS TMP1, (SELECT Column5 as Alias2 FROM Table WHERE Column2 = 1 AND Column3 = 1 AND Column4 =2) AS TMP2 

这将返回44 * 44行而不是44。

基于此: 两列sql查询合并结果

 SELECT q1.Alias1, q2.Alias2 FROM ( (SELECT Column5 as Alias1 FROM Table WHERE Column2 = 1 AND Column3 = 1 AND Column4 =1) q1) JOIN (SELECT Column5 as Alias2 FROM Table WHERE Column2 = 1 AND Column3 = 1 AND Column4 =2) q1) q2 ON q1.Alias1 = q2.Alias2 

不起作用,因为我不想在任何条件下join表格,我只是想把结果放在一起。 另外,不编译。

类似于以上(由朋友推荐):

 SELECT Table1.Column5, Table2.Column5 FROM Table AS Table1, Table AS Table2 WHERE Column2 = 1 AND Column3 = 1 AND Column4 =1 AND Column2 = 1 AND Column3 = 1 AND Column4 =2 

不起作用,因为它返回44 * 44而不是44行(这是不必要的连接表)。

此外: 如何组合多个SQL查询? 是以上的组合。

为了给出一些上下文,我试图将Excel中的一组数据从一个长表格重新格式化为一个宽表格,以便对它们进行统计testing。 所以我受到Excel SQLfunction(Access语法)的限制。

任何帮助将不胜感激。

编辑:

我没有发布这个答案,因为它不是用SQL完全解决我的问题,但它解决了我的问题。

我用吉姆索萨的解决scheme,并修改它,我有:

 select iif([Column2]=1 AND [Column3]=1 AND [Column4]=1,Column5,null) as column1, iif([Column2]=1 AND [Column3]=1 AND [Column4]=2,Column5,null) as column2 ... (40 more iffs) from Table 

然后,我得到我想要的,但额外的空值。 然后我摆脱那些空值,像这样: http : //exceltactics.com/automatically-delete-blank-cells-organize-data/

就是这样。

谢谢你所有的回应。

我感谢您的意见,这不是一个典型的SQL问题:)

干杯

我很长一段时间没有使用访问,但我相信有几个方法可以做到这一点。 虽然更有趣的是这样的一个:

 select Max(iif(Column2 = 1 AND Column3 = 1 AND Column4 =1, column5, 0)) as column1, Max(iif(Column2 = 1 AND Column3 = 1 AND Column4 =2, column5, 0)) as column2, ... Max(iif(Column2 = 7 AND Column3 = 3 AND Column4 =4, column5, 0)) as column42 from table 

我在这里假设column5是一个正数,虽然它可能工作,即使它是一个string。 如果它不,你可能不得不将0更改为一个空string或一些这样的。 集合函数将确保您只返回一行。 你也可以在你的select子句中尝试多个子查询,但是我不确定这个访问是否支持。

您的第二个解决scheme基于join,非常接近。 您需要将其更改为join假人行号,如下所示:

 (SELECT (SELECT COUNT(*) FROM Table t WHERE t.Id < tt.Id) AS RowNum , Column5 as Alias1 FROM Table tt WHERE Column2 = 1 AND Column3 = 1 AND Column4 =1) AS q1 JOIN (SELECT (SELECT COUNT(*) FROM Table q WHERE q.Id < qq.Id) AS RowNum , Column5 as Alias2 FROM Table qq WHERE Column2 = 1 AND Column3 = 1 AND Column4 =1) AS q2 ON q1.RowNum = q2.RowNum 

(SELECT COUNT(*) FROM Table q WHERE q.Id < qq.Id) as RowNum技巧,为每个select的行分配一个人为的RowNum 。 你的表必须有一个唯一的ID列,以便这个技巧的工作。

放弃自己的努力! :P SQL并不总是答案。 我现在正在打我自己,因为我试图用它来解决我遇到的数据问题,但是在这种情况下,特别是在处理dynamic数量的列时, Excel数据透视表以这种方式很好地工作…

在我看来,这只不过是一个数据透视表的“类别”的连接。

由于2,3,4列仅仅是一个类别,表示一个用户的具体响应…创build一个伪列来在这个类别上进行转换,并如下所示进行转换。

我用了'。' 在我们进入多位数值的情况下将这些值分开。 如果需要,可以稍后parsing出来。

在列F中,我所做的是连接列b,c,d给我一个独特的价值作为列标题,这将是相同的每个用户(col1)

然后,我转向数据…瞧。

在这里输入图像说明

每个类别为每个响应/用户获取自己的列,每个用户都有自己的行,现在行标题实际上绑定到类别,而不必去查找你在SQL中做了什么…

随着更多的组合存在,更多的列被添加。 缺less特定类别数据的用户只需在该行/列交叉点处获得空白。 如10和3.1.1类。

删除总计,或改变如何相关,如果需要…最小/最大值,总和…无论如何。

我可以预见的唯一困难是如果col2,col3,col4实际上没有相同的值….(就像一个额外的空间或某些东西…),但作为值是数字,你正试图用例语句来筛选他们…我认为这将工作…

你反复提到,你不想要连接 – 我想这意味着实际上,在结果的第1列和第2列中你想要的数据之间没有任何关系。

您现在每个单独的查询获得44行的快乐事实并不意味着总是这样,并且您似乎无法确保query1的行号26与query2的行号26有任何关系

如果不能定义这样的关系,SQL也不能做到这一点! SQL是为了返回所有列在某种程度上相互关联的数据行。 如果你不能给一个关系,没有一个SQL引擎可以弥补这种关系。

如果以某种方式,你确信在44次查询中,第n行出现意外的情况与其他第n行有关,只是因为你认为数据是以有意义的方式返回的,只是在你所在的地方处理你的表示。 这不是在SQL中!

注意:如果确实有定义各行之间关系的方法,则应在查询中指明。 然后,您可以编写一个(难看的)查询来结合所有内容 – 但是更有可能的是,您的应用程序可以更好地处理这个问题!

我怀疑这在Access的作品,但它会返回你寻求的结果…

 with T as ( select column2, column3, column4, column5, row_number() over ( partition by column2, column3, column4 order by column5 /* ?? or possibly (select 1) for a random ordering of rows */ ) as rownum from <yourtable> ) select min(case when column2 = 1 and column3 = 1 and column4 = 1 then column5 end), min(case when column2 = 1 and column3 = 1 and column4 = 2 then column5 end), min(case when column2 = 1 and column3 = 1 and column4 = 3 then column5 end), min(case when column2 = 1 and column3 = 2 and column4 = 1 then column5 end), min(case when column2 = 1 and column3 = 2 and column4 = 2 then column5 end), min(case when column2 = 1 and column3 = 2 and column4 = 3 then column5 end), min(case when column2 = 1 and column3 = 3 and column4 = 1 then column5 end), min(case when column2 = 1 and column3 = 3 and column4 = 2 then column5 end), min(case when column2 = 1 and column3 = 3 and column4 = 3 then column5 end), ... min(case when column2 = 7 and column3 = 1 and column4 = 1 then column5 end), min(case when column2 = 7 and column3 = 1 and column4 = 2 then column5 end), min(case when column2 = 7 and column3 = 1 and column4 = 3 then column5 end), min(case when column2 = 7 and column3 = 2 and column4 = 1 then column5 end), min(case when column2 = 7 and column3 = 2 and column4 = 2 then column5 end), min(case when column2 = 7 and column3 = 2 and column4 = 3 then column5 end), min(case when column2 = 7 and column3 = 3 and column4 = 1 then column5 end), min(case when column2 = 7 and column3 = 3 and column4 = 2 then column5 end), min(case when column2 = 7 and column3 = 3 and column4 = 3 then column5 end) from T group by rownum 

也许Access更喜欢这个更好?

 select min(case when column2 = 1 and column3 = 1 and column4 = 1 then column5 end), min(case when column2 = 1 and column3 = 1 and column4 = 2 then column5 end), min(case when column2 = 1 and column3 = 1 and column4 = 3 then column5 end), min(case when column2 = 1 and column3 = 2 and column4 = 1 then column5 end), min(case when column2 = 1 and column3 = 2 and column4 = 2 then column5 end), min(case when column2 = 1 and column3 = 2 and column4 = 3 then column5 end), min(case when column2 = 1 and column3 = 3 and column4 = 1 then column5 end), min(case when column2 = 1 and column3 = 3 and column4 = 2 then column5 end), min(case when column2 = 1 and column3 = 3 and column4 = 3 then column5 end), ... min(case when column2 = 7 and column3 = 1 and column4 = 1 then column5 end), min(case when column2 = 7 and column3 = 1 and column4 = 2 then column5 end), min(case when column2 = 7 and column3 = 1 and column4 = 3 then column5 end), min(case when column2 = 7 and column3 = 2 and column4 = 1 then column5 end), min(case when column2 = 7 and column3 = 2 and column4 = 2 then column5 end), min(case when column2 = 7 and column3 = 2 and column4 = 3 then column5 end), min(case when column2 = 7 and column3 = 3 and column4 = 1 then column5 end), min(case when column2 = 7 and column3 = 3 and column4 = 2 then column5 end), min(case when column2 = 7 and column3 = 3 and column4 = 3 then column5 end) from ( select column2, column3, column4, column5, ( select count(*) from <yourtable> as t2 where t2.column2 = t1.column2 and t2.column3 = t2.column3 and t2.column4 = t1.column4 and t2.column5 < t1.column5 /* need some way to break ties */ ) as rownum from <yourtable> as t1 ) as T group by rownum 

没有任何关于第五栏(或第一栏的值)的描述,很难推测什么可能适合你。