0

我有两张桌子:ck_startupck_price。价格表包含cu_typeprd_typepart_cdqty和列dllrs。启动表通过 上的一对多关系链接到价格表ck_startup.prd_type_cd = ck_price.prd_type

价格表包含相同产品/零件/数量但在不同客户类型下的多个条目。并非所有客户类型都具有这三个值的相同唯一组合。我正在尝试创建一个查询,它将做两件事:

  1. 加入一些ck_startupck_price(描述和一些附加值)。
  2. 使用每个客户类型的列连接ck_price到自身。dllrs因此,总的来说,我将只有一个产品/零件/数量的每个唯一键的实例,以及每个客户的价格列中的一个值(如果他们有的话)。

我从未使用过自连接表,到目前为止,我只能获取记录以显示两个客户都有相同的可用选项。

而且因为有人会要求我发布示例代码,所以这是一个不显示缺失价格的蹩脚查询:

select pa.*, pac.dllrs from ck_price pa
join ck_price pac on pa.prd_type = pac.prd_type and pa.part_carbon_cd = pac.part_carbon_cd and pa.qty = pac.qty
where pa.cu_type = 'A' and pac.cu_type = 'AC';

编辑:这是来自两个表的示例数据,以及我希望它们在完成后的外观:

CK_STARTUP
+-----+------+-------------+
| 光盘 | DSC | PRD_TYPE_CD |
+-----+------+-------------+
| 3D | 东西 | SKD3 |
| 直流| 不同的东西| SKD |
| DN2 | 类似的东西 | SKD |
+-----+------+-------------+

CK_PRICE
+---------+-------------+---------+------+--------+
| CU_TYPE | PRD_TYPE_CD | PART_CD | 数量 | 动态链接库 |
+---------+-------------+---------+------+--------+
| 一个 | SKD3 | 1 | 100 | 10 |
| 一个 | SKD3 | 1 | 200 | 20 |
| 一个 | SKD3 | 1 | 300 | 30 |
| 一个 | SKD | 1 | 100 | 50 |
| 一个 | SKD | 1 | 200 | 100 |
| 交流 | SKD3 | 1 | 300 | 30 |
| 交流 | SKD | 1 | 100 | 100 |
| 交流 | SKD | 1 | 200 | 200 |
| 交流 | SKD | 1 | 300 | 300 |
| 交流 | SKD | 1 | 400 | 400 |
+---------+-------------+---------+------+--------+

组合:
+----+-----------------+---------+-----+---------+ ----------+
| 光盘 | DSC | PART_CD | 数量 | DLLRS_A | DLLRS_AC |
+----+-----------------+---------+-----+---------+ ----------+
| 3D | 东西 | 1 | 100 | 10 | 空 |
| 3D | 东西 | 1 | 200 | 20 | 空 |
| 3D | 东西 | 1 | 300 | 30 | 60 |
| 直流| 不同的东西| 1 | 100 | 50 | 100 |
| 直流| 不同的东西| 1 | 200 | 100 | 200 |
| 直流| 不同的东西| 1 | 300 | 空 | 300 |
| 直流| 不同的东西| 1 | 400 | 空 | 400 |
+----+-----------------+---------+-----+---------+ ----------+
4

1 回答 1

1

好的,看看下面的查询和结果:

SELECT *
FROM   (SELECT
          cs.cd, cs.dsc, cp.part_cd, cp.qty, cp.dllrs, cp.cu_type
        FROM ck_startup cs
          JOIN ck_price cp ON (cs.prd_type_cd = cp.prd_type_cd))
PIVOT (SUM(dllrs) AS dlllrs FOR (cu_type) IN ('A' AS a, 'AC' AS ac))
ORDER BY cd, qty
;

输出:

CD DSC PART_CD 数量 A_DLLLRS AC_DLLLRS
-------- ----- ---------- -------- -------- -- ----------
3D 素材 1 100 10            
3D 素材 1 200 20            
3D 素材 1 300 30 30
DC 不同的东西 1 100 50 50
DC 不同的东西 1 200 100 100
DC 不同的东西 1 300 150
DC 不同的东西 1 400 200
DN2 类似物 1 100 50 50
DN2 类似物 1 200 100 100
DN2 类似的东西 1 300 150
DN2 类似的东西 1 400 200

这不是您所期望的,因为我不明白为什么您DLLRS_AC在表中的列中有不同的值CK_PRICE?我的意思是,例如,为什么你400在输出的最后一行有,而不是200?为什么这个值加倍(正如DLLRS_AC列中的其他值一样)?

如果您使用的是 Oracle 10g,您可以使用DECODEand获得相同的结果GROUP BY,看看:

SELECT
        cd,
        dsc,
        part_cd,
        qty,
        SUM(DECODE(cu_type, 'A', dllrs, NULL)) AS dllrs_a,
        SUM(DECODE(cu_type, 'AC', dllrs, NULL)) AS dllrs_ac
FROM (
  SELECT
    cs.cd, cs.dsc, cp.part_cd, cp.qty, cp.dllrs, cp.cu_type
  FROM ck_startup cs
    JOIN ck_price cp ON (cs.prd_type_cd = cp.prd_type_cd)
  )
GROUP BY cd, dsc, part_cd, qty
ORDER BY cd, qty;

结果是一样的。

如果您想了解更多关于旋转的信息,我推荐 Tim Hall 的文章:Oracle Base 的 Pivot and Unpivot

于 2013-11-04T21:28:15.037 回答