我正在尝试编写一个不错的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)
答案 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来保持一切有条理。