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

时间:2016-10-14 11:22:30

标签: sql oracle pivot

我有一张表有4个尺寸的外国人。 我想找到基于2维的独特组合。

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
-----------------------------

在这里,我希望TABLE2ID基于TYPE和DIR行的组合,这是唯一的。

因此,如果您根据TYPE和DIR汇总行值,您将获得

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

注意: 回答上述问题

  

与此相关的其他问题。

我有另一张表,其中包含基于小时的table2 id计数。

我希望将table1中所有小时的所有小时数组合成唯一组合(不要担心表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),根据表1的唯一值对输出进行分组

----------------------------------
TYPE    DIR     DATE        COUNT
----------------------------------
10      IN      20161016    200
20      OUT     20161016    100
---------------------------------

2 个答案:

答案 0 :(得分:1)

使用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;

答案 1 :(得分:0)

您可以加入两个子查询,一个选择类型,另一个选择相同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