2011-07-12 5 views
1

列の列ではなく、クエリの結果を列挙しようとしています。私はピボットテーブルと数多くのアイテムを研究しており、ここに質問を投稿すると考えていました。このクエリは、レストランチェーンのために作られた預金のリストを取得しています。 1日あたり1つまたは最大5つの可能性があります。ソフトウェアを製造するソフトウェアは、通常の取引に記載されており、番号は付けられていません。SQLの結果が列でない

以下は私の質問です。

use SpeedlinkDB 
SELECT 
    ad.StoreID, 
    (ad.Amount * -1) as anAmount  
FROM AccountDetail ad 
LEFT JOIN DayFileSummary DF ON ad.StoreId = DF.StoreID and ad.EODID = DF.EODID  
WHERE 
(DATEDIFF(d, df.DF_BusinessDay, GETDATE()) = 1)  
AND (ad.TransType = 18) 
GROUP BY 
    ad.StoreID, 
    ad.Amount  
ORDER BY ad.StoreID 

クエリ結果....私が望む何

StoreID anAmount 
1104  667.28 
1104  110.00 
1107  750.00 
1107  211.00 
1107  464.20 
1205  280.11 
etc.. 

は、我々は要約情報を表示するには、Reporting Servicesを使用している以下の...

StoreID Deposit1 Deposit2 Deposit3 Deposit4 
1104  667.28  110.00 
1107  750.00  211.00  464.20 
1205  280.11 

主な理由です前日の管理。他の情報の中で、彼らはそれぞれの預金、販売などを見たいと思っています...

あなたが提供できる任意のヘルプをありがとうございます。

答えて

1

ラジェッシュChamarthiの答えのビル(1)あなたはマトリックス・コントロールを使用している場合、あなたはcase文とピボットを避けることができます。

http://www.sqlservercentral.com/articles/Reporting+Services+%28SSRS%29/63415/

あなたはまだラジェッシュのROW_NUMERを使用する必要があります()預金でそれを分割するために...しかし、マトリックス・コントロールを使用した場合は、case文をスキップすることができます...あなたの助けのためのあなたの両方に

SELECT 
    StoreID, 
    Deposit, 
    ROW_NUMBER() OVER(partition by StoreID) AS DepositNumber 
from (<< Your Query above>>) 
+0

これはまさに私が探しているものです、少なくともほとんど。私は道に沿って他の多くのもののためにそれを使用すると確信しているので、私は節約します。ボヘミアンの上の燃え上がっている限り、それはどんな掲示板にもあります。しかし、預金の番号付けは機能しますが、それらはすべて組み合わされます。私は彼らがOPで持っているレイアウトのように、個々の店舗の番号になるようにしています。現在のところ、1〜540です。 DepositNumberは1,2,3を開始し、次のストアに着いたときにやり直します。 –

4

ROW_NUMBER関数を使用して、各StoreIDに一連番号を割り当て、IDとキーを使用してピボットを実行できます。

預託金を注文したい他のパラメータ(預金時間など)がある場合は、windowing句でパーティションを追加することができます。

このようなものです。

select StoreID, 
     max(case DepositNumber when 1 then Deposit else null end) Deposit1 
     max(case DepositNumber when 2 then Deposit else null end) Deposit2 
     max(case DepositNumber when 3 then Deposit else null end) Deposit3 
     max(case DepositNumber when 4 then Deposit else null end) Deposit4 
     max(case DepositNumber when 5 then Deposit else null end) Deposit5 
    from (
      SELECT StoreID, 
        Deposit, 
        ROW_NUMBER() OVER(partition by StoreID) AS DepositNumber 
      from (<< Your Query above>> 
     ) 
    group by StoreID; 
+0

ご回答いただきありがとうございます。 SQLの場合、DECODEの代わりにCASEと同じ理論を使用しますか? –

+0

@Ken。あなたは正しいです。私はオラクルのバックグラウンドから来ています。したがって、デコードします:)。上記の私の質問を更新しました。 –

+0

+1興味深いアプローチ。 – NotMe

0

感謝。 2番目の答えはより少ないリソースを使用し、より高速でしたが、入力を感謝しています。私の間違いは、私が受け取っていたエラーのためにパーティションをオーダーに置き換えることでした。それらを両方使うと、私が探しているものを正確に得ることができます。ありがとう!

SELECT 
ad.StoreID, 
ad.Amount, 
ROW_NUMBER() OVER(Partition By ad.StoreID Order by ad.StoreID) AS DepositNumber 
FROM AccountDetail ad 
LEFT JOIN DayFileSummary DF ON ad.StoreId = DF.StoreID and ad.EODID = DF.EODID 

WHERE 
(DATEDIFF(d, df.DF_BusinessDay, GETDATE()) = 1) 

AND (ad.TransType = 18)