0

rsProductClassデータベース内のテーブルから返されるという名前のレコードセットがあります。それは非常に単純SELECT * FROM Table WHERE ProductID = {ID Value Here}で、表は次のようになります。

ProductID | UPPERTIER | LOWERTIER | NATIER  | OTHERTIER
1           20          60          10        10
2           10          90          NULL      NULL
3           NULL        40          NULL      5

テーブルには、さまざまな層ごとに値がある場合とない場合があります。

私がやりたいことは、どの列が最も高い値を持ち、その列の名前が何であるかをユーザーに示すことです。たとえば、 を表示している場合、ページには「これは製品ProductID 2である可能性が高い」と表示されます。LOWERTIER

rsProductClass各列の値で並べ替えられたそのクエリの列のリストが返されるように、クエリを並べ替える必要があります。NULL 値をゼロとして扱いたい。

valuelist()いくつかの型関数をいじろうとしArrayToList()ましたが、NULL 値でクラッシュします。配列に列を追加し、ArraySort()それらを何らかの順序で取得するために使用すると、NULL 値があるため、「位置 1 は数値ではありません」などのエラーが表示されます。

これは ColdFusion でできることですか? 私の能力を超えたレコードセットのある種のピボットだと思います。

4

3 に答える 3

2

次のようなものが機能します。

<cfquery name="tiers" datasource="...">
    SELECT ProductID, UPPERTIER VALUE, 'UPPERTIER' TIER
    WHERE  UPPERTIER IS NOT NULL
    UNION 
    SELECT ProductID, LOWERTIER VALUE, 'LOWERTIER' TIER
    WHERE  LOWERTIER IS NOT NULL
    UNION
    SELECT ProductID, OTHERTIER VALUE, 'OTHERTIER' TIER
    WHERE  OTHERTIER IS NOT NULL
    UNION
    SELECT ProductID, NATIER VALUE, 'NATIER' TIER
    WHERE  NATIER IS NOT NULL
    ORDER BY ProductID, VALUE
</cfquery>

<cfset productGroup = StructNew()>

<cfoutput query="tiers" group="ProductID">
  <cfset productGroup[ProductID].TIER = TIER>
  <cfset productGroup[ProductID].VALUE = VALUE>
</cfoutput>

<cfdump var="#productGroup#">

ColdFusion 10 以降では、 を使用できますが<cfloop query="..." group="...">、それ以前は使用する<cfoutput>必要があります。

于 2015-01-20T12:31:45.767 に答える
2

クエリのピボットを解除したい場合は、次のようにするとよいでしょう。COALESCE()代わりに使用しましたISNULL()(この状況ではどちらかが機能しますCOALESCE()が、ANSI標準です)。この列tier_rankは、指定された層のランクを示します。つまり、値が最も高い層のランクは になり1ます。両方とも最高の値を持つ 2 つの層がある場合、両方の値がtier_rankof になります (これがof の代わりに1使用する理由です--要件により適している場合は、使用することもできます)。RANK()ROW_NUMBER()DENSE_RANK()

SELECT p1.product_id, p1.tier_name, p1.tier_value
     , RANK() OVER ( PARTITION BY p1.product_id ORDER BY p1.tier_value DESC ) tier_rank
  FROM (
  SELECT product_id, 'UPPERTIER' AS tier_name
       , COALESCE(uppertier, 0) AS tier_value
    FROM products
   UNION ALL
  SELECT product_id, 'LOWERTIER' AS tier_name
       , COALESCE(lowertier, 0) AS tier_value
    FROM products
   UNION ALL
  SELECT product_id, 'NATIER' AS tier_name
       , COALESCE(natier, 0) AS tier_value
    FROM products
   UNION ALL
  SELECT product_id, 'OTHERTIER' AS tier_name
       , COALESCE(othertier, 0) AS tier_value
    FROM products
) p1

こちらの SQL Fiddle デモをご覧ください。

上記のピボットされていないクエリを再度ピボットすることは可能かもしれませんが、その試みが失敗したことを認めなければなりません。

于 2015-01-20T12:58:55.033 に答える