基本选择不同的问题

时间:2015-07-17 13:05:47

标签: sql db2-400

我有这样的数据:

  otord#       otusrn        ottrnc           ojhttn$          ottrnd
----------------------------------------------------------------------
   123           Joe          AAA              100.00         07/17/15
   123           Joe          BBB              100.00         07/16/15

我做了这个选择:我真的只想在订单#和amt上选择distinct。但我想要展示otusrn和代码,这是其中的一部分。所以我想要123和100 $作为唯一但其他列的“标记”是什么呢?

SELECT DISTINCT otord#, 
                ohttn$, 
                ottrnd 
FROM replib.clspaytpl 
WHERE otusrn IN ('ANDON', 'SCH', 'JRU', 'BERT', 'TRA', 'LINA')
AND ottrnd >= 20140701

2 个答案:

答案 0 :(得分:1)

您的问题是,您没有指定您想要使用"标签沿着"列,因为它们不是唯一的,您可以为同一记录获得许多结果。您必须将它们包含在distinct子句中,或者从许多可能的记录中选择一个。

如果您并不真正关心"标签的价值,那么"在列中,您可以对它们使用max()来仅返回最大值,但请记住,当它们不同时,您将丢失数据。如下所示:

SELECT otord#, max(otusrn), max(ottrnc), ojhttn$, max(ottrnd)
FROM replib.clspaytpl 
WHERE otusrn IN ('ANDON', 'SCH', 'JRU', 'BERT', 'TRA', 'LINA')
AND ottrnd >= 20140701
group by otord#, ojhttn$

答案 1 :(得分:1)

要仅检索与标题记录连接的组中的第一个详细记录,您可以使用如下语法:

WITH head (otord#, ojhttn$) as (
  SELECT DISTINCT otord#, ojhttn$
    FROM replib.clspaytpl
    WHERE otusrn in ('ANDON','SCH','JRU','BERT','TRA','LINA')
      AND ottrnd >= 20140701)
SELECT h.otord#, h.ojhttn$, d.otusrn, d.ottrnc, d.ottrnd
  FROM head h, 
       TABLE (SELECT * 
          FROM replib.clspaytpl
          WHERE otord# = h.otord# 
            AND ojhttn$ = h.ojhttn$
            AND otusrn in ('ANDON','SCH','JRU','BERT','TRA','LINA)
            AND ottrnd >= 20140701
          FETCH FIRST ROW ONLY) d

如果您有一个真实的头文件,每个订单/金额只包含一个记录,您可以使用它而不是CTE(公用表表达式)。