3

私のクエリは以下の通りです

SELECT SupplierId,StakeholderSupplierId,Percentage
FROM std_Stakeholders    
ORDER BY SupplierId

以下のような結果が得られます

SupplierId        StakeholderSupplierId             Percentage
1                          3175                        68.00
2929                       5504                        25.00
5504                        1                          68.25
5504                       3238                        50.00
5504                       2810                        23.00

この出力を として変換したい。

  SupplierId    StakeholderSupplierId1  Percentage  StakeholderSupplierId2  Percentage StakeholderSupplierId3   Percentage
    1                    3175            68.00  
    2929                 5504            25.00
    5504                  1              68.68             3238                50.00                2810            23.00

joins と pivoting を試しました。目的の出力を得るための適切なクエリを作成できませんでした。誰でも私を助けてくれますか

注: StakeholderSupplierId は static ではありません。1 から n まで変化する可能性があります

4

3 に答える 3

1

これが問題の解決策であるかどうかはわかりませんが (このクエリの後に何をする必要があるかによって異なります)、このような問題に対しては MySQLGROUP_CONCAT関数を使用しています。SQL Server での同様のソリューションについては、この質問を確認してください。

関数を使用すると、GROUP_CONCAT次のような結果テーブルを取得できます。

SupplierId    StakeholderSupplierIds  Percentages  
1             3175                    68.00  
2929          5504                    25.00
5504          1, 3238, 2810           68.68, 50.00, 23.00
于 2012-04-06T07:57:29.900 に答える
0

ええと、これは2段階のプロセスで行うことができますが、同様に、PIVOT-で可能であると期待しています。ただし、例として(最後の段階の古いスタイルのアプローチ):

declare @stakeholdersForPivot table
(
  SupplierId int,
  StakeholderId int,
  StakeholderSupplierId int,
  Percentage decimal(19,2)
)

; with orderedStakeholders as
(
  select SupplierId
  , ROW_NUMBER() over (partition by SupplierId order By StakeholderSupplierId) StakeholderId
  ,StakeholderSupplierId, Percentage
  from std_Stakeholders

)

insert into @stakeholdersForPivot (SupplierId, StakeholderId, StakeholderSupplierId, Percentage)
select SupplierId, StakeholderId, StakeholderSupplierId, Percentage
from orderedStakeholders

select SupplierId
, sum(case when StakeholderId = 1 then StakeholderSupplierId else null end) StakeholderSupplierId1
, sum(case when StakeholderId = 1 then Percentage else null end) Percentage1
, sum(case when StakeholderId = 2 then StakeholderSupplierId else null end) StakeholderSupplierId2
, sum(case when StakeholderId = 2 then Percentage else null end) Percentage2
, sum(case when StakeholderId = 3 then StakeholderSupplierId else null end) StakeholderSupplierId3
, sum(case when StakeholderId = 3 then Percentage else null end) Percentage3
from @stakeholdersForPivot
group by SupplierId
order by SupplierId

明らかに、サプライヤごとに期待する利害関係者サプライヤの最大数について明示する必要がありますが、必要に応じてこれを拡張できます。

于 2012-04-06T07:40:48.053 に答える
0

「GROUP BY MAX」トリックを使用するクエリを次に示します。データベース間で動作するはずです。欠点は、列リストが静的であることです。

SELECT
    supplierid,
    max(StakeholderSupplierId1) AS StakeholderSupplierId1,
    max(percentage1) AS percentage,
    max(StakeholderSupplierId2) AS StakeholderSupplierId2,
    max(percentage2) AS percentage,
    max(StakeholderSupplierId3) AS StakeholderSupplierId3,
    max(percentage3) AS percentage
FROM
    (
        SELECT
            supplierid,
            CASE WHEN ranking = 1 THEN stakeholdersupplierid END AS StakeholderSupplierId1,
            CASE WHEN ranking = 1 THEN percentage END AS percentage1,
            CASE WHEN ranking = 2 THEN stakeholdersupplierid END AS StakeholderSupplierId2,
            CASE WHEN ranking = 2 THEN percentage END AS percentage2,
            CASE WHEN ranking = 3 THEN stakeholdersupplierid END AS StakeholderSupplierId3,
            CASE WHEN ranking = 3 THEN percentage END AS percentage3
        FROM
            (
                SELECT
                    supplierid,
                    stakeholdersupplierid,
                    percentage,
                    rank() OVER (PARTITION BY supplierid ORDER BY percentage DESC) AS ranking
                FROM
                    std_stakeholders
            ) AS t
    ) AS t
GROUP BY
    supplierid
;
于 2012-04-06T09:57:20.360 に答える