2

ProductPricingの 2 つのテーブルがあります。Table Productは親テーブルで、Pricingは子テーブルです。Product の外部キーを使用してテーブル B にクエリを実行すると、データの有無にかかわらず、各外部キーに対して正確に 11 行を生成したいと考えています (すべての空の行と列を null で埋めます)。

以下は、私がこれまでに持っているもののサンプルです。正しく機能しませんが、基本的に私の目標は、ProductID ごとに 11 行を生成し、空の行の列を null 値で埋めることです

SELECT TOP 11
   row_number() over(order by TheCount desc) AS row_num,  PRODID,  packageID
FROM
    (
    select count(*) AS TheCount , PRODID ,max(PricingID) AS packageID
    from 
       Product left  outer  join   Pricing on PRODID = ProductID 
    group by PRODID
    UNION ALL
    SELECT TOP 11 -1, NULL, NULL, NULL, NULL, NUK
    FROM sys.columns
    ) T

例えば

 row_num        PRODID                                    PRICINGID                               COSBeginQty          COSColCode   COSTrade  COSTypeOfPrice  COSIsActive 
   1              A10D8642-F6DA-499E-9FC9-024FED104877      F82F533E-C1A0-4DC5-BB2C-06FFF2E59C18        2                 NULL              T2        A              1
   2              A10D8642-F6DA-499E-9FC9-024FED104877      372E6B36-F9D1-4EFA-8A15-08CE673EFFBA        12                NULL              T1        A              1
   3              A10D8642-F6DA-499E-9FC9-024FED104877      45E77A6F-DC2A-44BF-B6AE-0BE27BD2205F        7                 NULL              T2        A              1
   4              A10D8642-F6DA-499E-9FC9-024FED104877              NULL                                NULL              NULL              NULL      NULL       NULL
   5              A10D8642-F6DA-499E-9FC9-024FED104877              NULL                                NULL              NULL              NULL      NULL       NULL
   6              A10D8642-F6DA-499E-9FC9-024FED104877              NULL                                NULL              NULL              NULL      NULL       NULL
   7              A10D8642-F6DA-499E-9FC9-024FED104877              NULL                                NULL              NULL              NULL      NULL       NULL
   8              A10D8642-F6DA-499E-9FC9-024FED104877              NULL                                NULL              NULL              NULL      NULL       NULL
   9              A10D8642-F6DA-499E-9FC9-024FED104877              NULL                                NULL              NULL              NULL      NULL       NULL
   10             A10D8642-F6DA-499E-9FC9-024FED104877              NULL                                NULL              NULL              NULL      NULL       NULL
   11             A10D8642-F6DA-499E-9FC9-024FED104877              NULL                                NULL              NULL              NULL      NULL       NULL

これは、データと、11行に拡張するように拡張しようとしている作業中のクエリを示すSQLFiddle Linkです。つまり、11行を列として表示します。

Damiens のサンプル コードを使用して、以下のコードをまとめることができました。製品テーブルの要素を Pricing テーブルに相互適用することは機能しますが、同じ PricingID を製品テーブルのすべての ProductID に適用するのではなく、価格レコードが適用される特定の ProductId のみに適用する場合を好みます。 .

4

3 に答える 3

0

基本的な方法では、数値テーブルROW_NUMBER()と左結合を使用します。

select
    *
from
    sys.tables st
        cross join
    (select distinct number from master..spt_values where number between 1 and 11) n
        left join
    (select *,ROW_NUMBER() OVER (PARTITION BY object_id order by name) rn from sys.columns) sc
        on
            st.object_id = sc.object_id and
            sc.rn = n.number

(ここでは、spt_valuesクエリが数値テーブルの代わりになっています)

これを任意のデータベースで実行して、スキームが一般的にどのように機能するかを確認できるはずです。はCROSS JOIN、親行ごとに 11 行を作成します。次に、 を使用して選択された最初の 11 人の子に結合しROW_NUMBER()ます。

私はあなたのデータを持っていないので、既存のクエリを使用して書き込もうとはしませんでした。

于 2012-09-25T07:40:44.430 に答える
0

再帰クエリが必要です。このようなもの:

;WITH tmp(i, tablename,total) AS(
SELECT ROW_NUMBER() OVER(PARTITION BY name ORDER BY name), CONVERT(varchar(MAX),name), (SELECT COUNT(*) FROM sys.columns WHERE object_id=t.object_id)
FROM sys.tables t
UNION ALL
SELECT i+1, tablename+' COPY '+CONVERT(varchar(4),i), total FROM tmp WHERE i <=20
)SELECT * FROM tmp ORDER BY 2, 1
于 2012-10-08T15:26:33.430 に答える
0

数値テーブルの使用に関する+1...数値テーブルがないため、値コンストラクターを使用して作成します(値構成はSQL Server 2008以降で機能します)。

select TP.ProductID, TNum.num, Tprices.PriceID
from Product TP
INNER JOIN (select num from (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11)) as T1(num)) TNum ON TNum.num BETWEEN 1 and 11
LEFT JOIN (select TP2.PriceID, ROW_NUMBER () OVER (PARTITION BY TP2.ProductID ORDER BY TP2.PriceID DESC) RowNum from Prices TP2) Tprices ON TNum.num = Tprices.RowNum
于 2012-11-14T18:39:50.597 に答える