SQL:帮助添加二级过滤器到图表查询

问题描述 投票:0回答:1

需要通过 HSQLDB 为 JFreeChart JDBC 返回 (x, y1, y2) 的查询。这是我到目前为止所拥有的:

SELECT "X", "Y" AS "**Y1**" FROM TABLE WHERE A=1,B=11,in1='chocolate',(ABS(in2 - 1000.0) < 0.01) ORDER BY "ID"; 
如何针对 Y2 不同地过滤 Y?我的线程正在将数据写入表中,因此我可以编写*多个*表,例如 TABLEi-j ,如果这样更容易?我的谷歌和堆栈溢出搜索引用了嵌套子查询公用表表达式(CTE)的示例,但我还没有掌握这个高级概念。

我用 VBA 宏在 Excel 中制作了一些示例数据。当 Callable 为图形写入进程内内存数据库时,真正的 Java 程序使用 ID 作为 List 的索引,该图形通过触发此查询的计时器动态更新。

ID  A   B   in1         in2         X       Y
1   1   11  chocolate   1,000.00    1.00    41.01
2   1   11  chocolate   1,000.00    1.50    41.28
3   1   11  chocolate   1,000.00    2.00    71.27
4   1   12  chocolate   1,000.00    1.00    32.62
5   1   12  chocolate   1,000.00    1.50    63.32
6   1   12  chocolate   1,000.00    2.00    20.76
7   2   11  chocolate   1,000.00    1.00    18.60
8   2   11  chocolate   1,000.00    1.50    58.34
9   2   11  chocolate   1,000.00    2.00    8.07
10  2   12  chocolate   1,000.00    1.00    45.80
11  2   12  chocolate   1,000.00    1.50    90.57
12  2   12  chocolate   1,000.00    2.00    26.14
Sub Macro1()
   Debug.Print ("ID,A,B,in1,in2,X,Y") ' CSV table header record
   counter% = 0
   For i% = 1 To 2
      For j% = 11 To 12
         For k = 1# To 2# Step 0.5
            counter% = counter% + 1
            Debug.Print (counter% & "," & i% & "," & j% & ",chocolate,1000.0," & k & "," & Rnd * 100#)
         Next k
      Next j%
    Next i%
End Sub

我尝试过嵌套子查询、CTE 和使用 JOIN 的单独表,但我的 SQL 技能并不高级。

sql jdbc database-design jfreechart hsqldb
1个回答
0
投票

我不认为您需要 CTE 或子查询(尽管我不确定我是否真正完全理解您的问题)。所以我提出 3 个疑问。第一个只是演示了 case 表达式 可以实现 Y1 和 Y2 的效果,但这可能不是您想要绘制图表的输出样式。第二个查询显示如何结合使用 case 表达式 inside 聚合函数(这里我使用

MAX()
)和
GROUP BY
子句,该子句按该子句中列出的列汇总数据。最后,有一个看似更复杂的查询,但这显示了如何独立过滤 Y1 和 Y2(然后您还可以调整 case 表达式以匹配)。该查询再次使用
GROUP BY
子句,但这里使用
SUM()
作为聚合函数。

CREATE TABLE YourTable (
    ID INT PRIMARY KEY,
    A INT,
    B INT,
    in1 VARCHAR(255),
    in2 DECIMAL(10, 2),
    X DECIMAL(10, 2),
    Y DECIMAL(10, 2)
);

INSERT INTO YourTable (ID, A, B, in1, in2, X, Y) VALUES
(1, 1, 11, 'chocolate', 1000.00, 1.00, 41.01),
(2, 1, 11, 'chocolate', 1000.00, 1.50, 41.28),
(3, 1, 11, 'chocolate', 1000.00, 2.00, 71.27),
(4, 1, 12, 'chocolate', 1000.00, 1.00, 32.62),
(5, 1, 12, 'chocolate', 1000.00, 1.50, 63.32),
(6, 1, 12, 'chocolate', 1000.00, 2.00, 20.76),
(7, 2, 11, 'chocolate', 1000.00, 1.00, 18.60),
(8, 2, 11, 'chocolate', 1000.00, 1.50, 58.34),
(9, 2, 11, 'chocolate', 1000.00, 2.00, 8.07),
(10, 2, 12, 'chocolate', 1000.00, 1.00, 45.80),
(11, 2, 12, 'chocolate', 1000.00, 1.50, 90.57),
(12, 2, 12, 'chocolate', 1000.00, 2.00, 26.14);

  1. 使用 case 表达式的简单选择查询
SELECT
      X
    , CASE WHEN A = 1 AND B = 11 THEN Y END AS Y1
    , CASE WHEN A = 2 AND B = 12 THEN Y END AS Y2
FROM YourTable
WHERE in1 = 'chocolate'
    AND ABS(in2 - 1000.0) < 0.01
ORDER BY ID
X Y1 Y2
1.00 41.01
1.50 41.28
2.00 71.27
1.00
1.50
2.00
1.00
1.50
2.00
1.00 45.80
1.50 90.57
2.00 26.14
  1. 使用“条件聚合”对查询进行分组(聚合函数内的 case 表达式)
SELECT
      X
    , MAX(CASE WHEN A = 1 AND B = 11 THEN Y END) AS Y1
    , MAX(CASE WHEN A = 2 AND B = 12 THEN Y END) AS Y2
FROM YourTable
WHERE in1 = 'chocolate'
    AND ABS(in2 - 1000.0) < 0.01
GROUP BY
      X
ORDER BY
      X
X Y1 Y2
1.00 41.01 45.80
1.50 41.28 90.57
2.00 71.27 26.14
  1. 允许对 Y1 和 Y2 进行“独立过滤”的查询,还具有与过滤器匹配的条件聚合。
SELECT
      X
    , SUM(CASE WHEN A = 1
                AND B = 11
                AND in1 = 'chocolate'
                AND ABS(in2 - 1000.0) < 0.01 THEN Y ELSE 0 END) AS Y1
    , SUM(CASE WHEN A = 2
                AND B = 12
                AND in1 = 'chocolate'
                AND ABS(in2 - 1000.0) < 0.01 THEN Y ELSE 0 END) AS Y2
FROM YourTable
WHERE (
        A = 1
        AND B = 11
        AND in1 = 'chocolate'
        AND ABS(in2 - 1000.0) < 0.01
        )
    OR (
        A = 2
        AND B = 12
        AND in1 = 'chocolate'
        AND ABS(in2 - 1000.0) < 0.01
        )
GROUP BY
      X
ORDER BY
      X
X Y1 Y2
1.00 41.01 45.80
1.50 41.28 90.57
2.00 71.27 26.14

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.