2017-06-10 14 views
0

良いSQLクエリを作成しようとしていますが、失敗しています。私は、次のことを返すSELECT文を作成しようとしています:SQLテーブルの変換

Balances 
* id 
* date 
* amount 
* item_id 

BalanceItems 
* id 
* name 

ので、列名(例えば、現金、チェックし、貯蓄が)BalanceItemsに格納されます。

Date  | Cash | Checking | Savings 
-------------------------------------- 
May 2017 | 30 | 300 | 3000 
Apr 2017 | 40 | 400 | 4000 

私のテーブルは、このようなものです。基本的には、列ヘッダーのBalanceItemsから名前を取得する方法がわかりません。


私はこれをDjangoで構築していますので、エレガントにこれを行う方法のアイデアもありがとうございます。これらはモデルです:

class Balances(models.Model): 
    item = models.ForeignKey('BalanceItems', related_name='balances_balance_items') 
    date = models.DateField() 
    amount = models.DecimalField(max_digits=9, decimal_places=2) 

class BalanceItems(models.Model): 
    name = models.CharField(max_length=100, unique=True) 

答えて

0

私が私の望ましい結果を得るためにpivotを使用することができるかもしれないようだが、そのコマンドはsqliteのには存在しません。 caseステートメントを使用したくないのは、列の量が変わる可能性があるからです。 私は、この1つのビューがすべてのデータベース呼び出しを行い、すべてを整理しておくためにPythonを使用するということを受け入れることになりました。

0

我々は期待値を知っていれば、私たちはpivotを使用することができます。

select [date], [Cash], [Checking], [Savings] 
from 
(
    select [date] 
    , amount 
    , name 
    from Balances b 
    inner join BalanceItems bi 
    on bi.id = b.item_id 
) source 
pivot 
(
    sum(amount) 
    for name in ([Cash], [Checking], [Savings]) 
) pvt 
order by [date] 

そうでなければ、我々はdynamic sqlを必要とします。ソリューションは、そうでない場合は上記のものと同じだけれども:

declare @sql nvarchar(max) 
select @sql = coalesce(@sql + ', ', '') + quotename(name) 
from @BalanceItems 
set @sql = ' 
    select [date], ' + @sql + ' 
    from 
    (
     select [date] 
     , amount 
     , name 
     from Balances b 
     inner join BalanceItems bi 
     on bi.id = b.item_id 
    ) source 
    pivot 
    (
     sum(amount) 
     for name in (' + @sql + ') 
    ) pvt 
    order by [date] 
' 
exec (@sql) 
+0

ああ、私の質問はあいまいです。私はそれを編集した。私は2つのSQLテーブルを持っています。最初のテーブルを結果として返すselect文を作成しようとしています。 – Bob

+0

ああ;理解された;あなたはピボットテーブルを探しています... 1ヶ月... – JohnLBevan

関連する問題