分解GROUP BY语句

时间:2011-08-03 18:09:20

标签: sql db2

假设我有一个表SomeTable,其中包含以下数据:

Primary Key    Column1    Column2    Column3    Column4    Column5    Num
    1           dat1       abc1       dat3       dat4       por7       1
    2           dat1       gcd4       dat3       dat4       yrt8       6
    3           dat1       iut7       dat3       dat4       asd6       2  
    4          other1     other2     other3     other4     other5      4 

使用如下查询创建的另一个表SomeTableGrouped,其中包含“Group Byed”版本:

INSERT INTO SomeTableGrouped
SELECT Column1, Column3, Column4, SUM(Num)
FROM SomeTable
GROUP BY Column1, Column3, Column4

Primary Key    Column1    Column3    Column4    Num
    100         dat1       dat3       dat4       9
    200        other1     other3     other4      4 

我希望能够做到的是,如果我的主键为SomeTableGrouped,我需要能够告诉SomeTable来自哪个特定行。

示例:

在单独的表RandomTable中,我有这样的数据:

Primary Key    Column1    SomeTableGroupedId
    1           dat1             100
    2           dat2             100

如果我查看第一行,我需要能够列出SomeTable

中的第1行第3行

我该怎么做?我不能非常改变模式(即我只能添加新列,删除列,添加新表)所以一个肮脏的解决方案对我来说完全没问题。

2 个答案:

答案 0 :(得分:1)

我认为这就是你想要的。

SELECT id
FROM SomeTable
INNER JOIN SomeTableGrouped ON
    (SomeTable.Column1 = SomeTableGrouped.Column1) AND
    (SomeTable.Column2 = SomeTableGrouped.Column2) AND
    (SomeTable.Column3 = SomeTableGrouped.Column3) 
WHERE SomeTableGrouped.id = ...

答案 1 :(得分:0)

您甚至不需要创建所有这些表,只需要SomeTable。但是我们走了......

如果要查找总结的记录的ID,只需将它们与创建时相关联:

select st.PrimaryKey as STPK,  stg.PrimaryKey as STGPK
from SomeTable st 
inner join SomeTableGrouped stg
on (st.Column1 = stg.Column1 and 
    st.Column3 = stg.Column3 and 
    st.Column5 = stg.Column5)

但是,您甚至不应该将SomeTableGrouped创建为表格。它可以是一个视图(看here to see how create views in DB2)。

这样,您确保数据始终是最新的,并且您不必担心回溯跟踪(“如果Num更新会怎样?”)。