【问题标题】:How to combine the results of different queries into one?如何将不同查询的结果合二为一?
【发布时间】:2017-10-16 16:40:10
【问题描述】:

我在一列中有情绪分析的结果。我想显示每个数字代表什么以及计数,如下所示:

 Neg | Neutral | Pos 
---------+-----+-----
  30 |   55    | 100 

我尝试了许多在互联网上找到的不同方法,但均无济于事。 db2 语法似乎经常更改,并且我找到的所有文档都不适用于我当前的 bluemix 帐户。

我能得到的最接近的是 UNION:

SELECT  COUNT(*) as NEGATIVE      FROM C7  WHERE SENTIMENT = 1
union
SELECT  COUNT(*) as NEUTRAL       FROM C7  WHERE SENTIMENT = 2
union
SELECT  COUNT(*) as Pos           FROM C7  WHERE SENTIMENT = 3

但是,这给了我:

NEGATIVE
--------
   30
   55
  100

如何并排合并每个查询的结果?


我尝试了 Pivoting in DB2 帖子中的答案,但出现错误:

SELECT 
  C7.SENTIMENT,
  COUNT(CASE WHEN C7.SENTIMENT = 1 THEN Value END) AS NEGATIVE,
  COUNT(CASE WHEN C7.SENTIMENT = 2 THEN Value END) AS NEUTRAL,
  COUNT(CASE WHEN C7.SENTIMENT = 3 THEN Value END) AS POSITIVE,
FROM C7
GROUP BY C7.SENTIMENT

SQL0206N: SQL0206N “VALUE”在使用它的上下文中无效。 SQLSTATE=42703

SELECT DISTINCT
  C7.SENTIMENT,
    (SELECT value  FROM C7  WHERE C7.SENTIMENT = 1) AS VERY_NEGATIVE,
    (SELECT value  FROM C7  WHERE C7.SENTIMENT = 2) AS NEGATIVE,
    (SELECT value  FROM C7  WHERE C7.SENTIMENT = 3) AS NEUTRAL
FROM C7

SQL0206N: SQL0206N “VALUE”在使用它的上下文中无效。 SQLSTATE=42703

【问题讨论】:

  • Pivoting in DB2的可能重复
  • @Clockwork-Muse 不,尝试了所有这些答案,无效,将更新我的帖子,说明为什么不是这样。还是谢谢。
  • 它可能认为VALUE 在这里被用作关键字(因为它是保留字,尽管它至少在某些情况下可以用作列名)。但是,除非您尝试引用的任何内容都可以为空,否则您不在乎它包含什么,因此您可以替换一个常量值(1 是最喜欢的)。 (根据我的经验 column-not-found 会产生不同的异常,因此不太可能源于此)
  • 鉴于this other question,实际上您更有可能定义了一个您尝试使用的新本地列名称 (<blah> as value),而您并未将其包含在语句中。如果您切换到源列,或者只是一个常量值,现有答案是否有效?

标签: db2


【解决方案1】:

好的,所以在修改了一些答案之后,我终于得到了我想要的东西:

SELECT DISTINCT
  (SELECT COUNT(SENTIMENT) FROM C7 WHERE C7.SENTIMENT = 1) AS NEGATIVE,
  (SELECT COUNT(SENTIMENT) FROM C7 WHERE C7.SENTIMENT = 2) AS NEUTRAL,
  (SELECT COUNT(SENTIMENT) FROM C7 WHERE C7.SENTIMENT = 3) AS POSITIVE
FROM C7

这似乎是我徘徊了很长时间,但找不到,因为有些帖子用奇怪的表名和值回答了这个问题。

所以基本上,要让查询彼此相邻,您必须使用多个SELECTs。

另外,请注意我使用了DISTINCT,否则它会为我的数据库中的每一行提供相同数据的副本。

【讨论】:

  • .... DISTINCT 是不必要的,因为如果你要走这条路,你应该做一些不同的事情,要么将这三个都放入 VALUES 语句中,要么使用 dummy表 (sysibm.sysdummy1) 给自己单行。如果你很幸运,系统能够查看该查询并优化DISTINCT,否则你只是在惩罚自己。
猜你喜欢
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
相关资源
最近更新 更多