根据 id 的选择性行对列值进行分组

Group the column value based on selective rows for an id

我有一个 table 有 4 个维度的外国人。 我想找到基于二维的唯一组合。

TABLE1
-----------------------------
ID  NAME    VALUE   TABLE2ID
-----------------------------
1   TYPE    10      1       
2   DIR     IN      1
3   STATE   MA      1
4   COUNT   100     1
5   TYPE    10      2       
6   DIR     IN      2
7   STATE   SA      2
8   COUNT   200     2
9   TYPE    20      3       
10  DIR     OUT     3
11  STATE   MA      3
12  COUNT   300     3
-----------------------------

在这里,我想要基于唯一的 TYPE 和 DIR 行组合的 TABLE2ID。

所以,在这里,如果您根据 TYPE 和 DIR 聚合行值,您将得到

-----------------------------
TYPE    DIR TABLE2ID
-----------------------------
10      IN  1
10      IN  2
20      OUT 3
-----------------------------

注意: 以上问题已回答

Additional Question related to this.

我有另一个 table,它有 table2 id 基于小时的计数。

我想将一天中所有时间的所有计数分组为 table1 中的唯一组合(不用担心 table 2 结构)。

TABLE3
-----------------------------
ID  TIME    COUNT   TABLE2ID
-----------------------------
1   2016101601  10      1       
2   2016101602  20      1
3   2016101603  30      1       
4   2016101604  40      1
5   2016101601  10      2       
6   2016101602  20      2
7   2016101603  30      2       
8   2016101604  40      2
9   2016101601  10      3       
10  2016101602  20      3
11  2016101603  30      3       
12  2016101604  40      3
-----------------------------

在这里,我希望根据类型和名称(不管 table2id)

根据 table 1 的唯一值对输出进行分组
----------------------------------
TYPE    DIR     DATE        COUNT
----------------------------------
10      IN      20161016    200
20      OUT     20161016    100
---------------------------------

您可以加​​入两个子查询,一个选择类型,一个选择相同 ID 的目录:

SELECT type, dir, a.table2id
FROM   (SELECT value AS type, table2id
        FROM   table1
        WHERE  name = 'TYPE') a
JOIN   (SELECT value AS dir, table2id
        FROM   table1
        WHERE  name = 'DIR') b ON a.table2id = b.table2id

使用 PIVOT:

Oracle 设置:

CREATE TABLE table1 ( id, name, value, table2id ) AS
SELECT  1, 'TYPE',  '10',  1 FROM DUAL UNION ALL
SELECT  2, 'DIR',   'IN',  1 FROM DUAL UNION ALL
SELECT  3, 'STATE', 'MA',  1 FROM DUAL UNION ALL
SELECT  4, 'COUNT', '100', 1 FROM DUAL UNION ALL
SELECT  5, 'TYPE',  '10',  2 FROM DUAL UNION ALL
SELECT  6, 'DIR',   'IN',  2 FROM DUAL UNION ALL
SELECT  7, 'STATE', 'SA',  2 FROM DUAL UNION ALL
SELECT  8, 'COUNT', '200', 2 FROM DUAL UNION ALL
SELECT  9, 'TYPE',  '20',  3 FROM DUAL UNION ALL
SELECT 10, 'DIR',   'OUT', 3 FROM DUAL UNION ALL
SELECT 11, 'STATE', 'MA',  3 FROM DUAL UNION ALL
SELECT 12, 'COUNT', '300', 3 FROM DUAL;

查询:

SELECT *
FROM   ( SELECT name, value, table2id FROM table1 )
PIVOT  ( MAX(value) FOR name IN ( 'TYPE' AS type, 'DIR' AS DIR ) );

输出:

TABLE2ID TYPE DIR
-------- ---- ---
       1 10   IN
       2 10   IN
       3 20   OUT

或者作为替代:

SELECT table2id,
       MAX( CASE WHEN name = 'TYPE' THEN value END ) AS type,
       MAX( CASE WHEN name = 'DIR'  THEN value END ) AS dir
FROM   table1
GROUP BY table2id;