转换SQL表

时间:2017-06-10 16:20:32

标签: sql django

我正在尝试编写一个不错的SQL查询,但我失败了。我正在尝试创建一个返回以下内容的select语句:

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

我的表格是这样的:

Balances
* id
* date
* amount
* item_id

BalanceItems
* id
* name

因此列名称(例如现金,支票和储蓄)存储在BalanceItems中。基本上我不知道如何从列标题中的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)

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

似乎我可以使用pivot来获得我想要的结果,但该命令在sqlite中不存在。我不想使用case语句,因为列数可能会发生变化。 所以我最终接受了这一个视图将进行一大堆数据库调用并使用Python来保持一切有条理。