我有一个名为assets
的CTE表(请记住,帐户和ISIN的数量是数十个和数百个):
+---------------------------+---------+----------------+---------------------+--------------------+----------+----------------------+------------------+--------+
| Date | Account | ISIN | Quantity | Value | Currency | Price | PriceCHF | FXRate |
+---------------------------+---------+----------------+---------------------+--------------------+----------+----------------------+------------------+--------+
| 2019-02-28 00:00:00 | 1 | CH5055181629 | 0.00000000 | 0.000000 | CHF | 1124.56 | 1124.56 | 1 |
| 2019-02-28 00:00:00 | 6 | CH5055181629 | 0.37866100 | 425.827014 | CHF | 1124.56 | 1124.56 | 1 |
| 2019-02-28 00:00:00 | 7 | CH5055181629 | 0.67151800 | 755.162282 | CHF | 1124.56 | 1124.56 | 1 |
| 2019-02-28 00:00:00 | 8 | CH5055181629 | 0.45240000 | 508.750944 | CHF | 1124.56 | 749.7067 | 1.5 |
| 2019-02-28 00:00:00 | 9 | CH5055181622 | 0.02204500 | 24.790925 | CHF | 1124.56 | 749.7067 | 1.5 |
| 2019-02-28 00:00:00 | 10 | CH5055181622 | 0.08353300 | 93.937870 | CHF | 1124.56 | 749.7067 | 1.5 |
| 2019-02-28 00:00:00 | 11 | CH5055181622 | 0.89667100 | 1008.360340 | CHF | 1124.56 | 749.7067 | 1.5 |
+---------------------------+---------+----------------+---------------------+--------------------+----------+----------------------+------------------+--------+
我想基于ISIN动态更改列。当前,我有以下查询:
SELECT *
INTO #assets
FROM (SELECT xxx
FROM yyyy) a
DECLARE @cols AS NVARCHAR(max),
@query AS NVARCHAR(max);
SET @cols = Stuff((SELECT DISTINCT ',' + Quotename(c.ISIN)
FROM #assets c
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, ''
)
SET @query = 'SELECT date, account, ' + @cols
+ ' from #assets x pivot ( max(quantity) for ISIN in (' + @cols
+ ')) p '
EXECUTE(@query)
DROP TABLE #assets
结果是一个带有日期,帐户的表,每个ISIN的每一列都有数量值。原始查询中的每个关联数量行在字段中都有其数量值,其他ISIN
列为NULL
。
现在,我希望列不仅限于数量。我希望列的名称为例如ISIN + '_quantity'
和ISIN + '_value'
。
此外,我希望数量值不是针对每一行,而是针对每个Date
和Account
进行汇总。
所以,我当前的结果如下:
+---------------------------+---------+--------------+----------------+
| Date | Account | CH5055181629 | CH5055181622 |
+---------------------------+---------+--------------+----------------+
| 2019-02-28 00:00:00 | 1 | 0.000000 | NULL |
| 2019-02-28 00:00:00 | 6 | 0.378661 | NULL |
| 2019-02-28 00:00:00 | 7 | 0.671518 | NULL |
| 2019-02-28 00:00:00 | 8 | 0.452400 | NULL |
| 2019-02-28 00:00:00 | 9 | 0.000000 | NULL |
| 2019-02-28 00:00:00 | 10 | 0.000000 | NULL |
| 2019-02-28 00:00:00 | 11 | 0.000000 | NULL |
| 2019-02-28 00:00:00 | 1 | NULL | 0.000000 |
| 2019-02-28 00:00:00 | 6 | NULL | 0.000000 |
| 2019-02-28 00:00:00 | 7 | NULL | 0.000000 |
| 2019-02-28 00:00:00 | 8 | NULL | 0.000000 |
| 2019-02-28 00:00:00 | 9 | NULL | 0.022045 |
| 2019-02-28 00:00:00 | 10 | NULL | 0.083533 |
| 2019-02-28 00:00:00 | 11 | NULL | 0.896671 |
+---------------------------+---------+--------------+----------------+
现在我期望的结果如下:
+---------------------------+---------+-----------------------+-----------------------+--------------------+--------------------+
| Date | Account | CH5055181629_quantity | CH5055181622_quantity | CH5055181629_value | CH5055181622_value |
+---------------------------+---------+-----------------------+-----------------------+--------------------+--------------------+
| 2019-02-28 00:00:00 | 1 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| 2019-02-28 00:00:00 | 6 | 0.378661 | 0.000000 | 425.827014 | 0.000000 |
| 2019-02-28 00:00:00 | 7 | 0.671518 | 0.000000 | 755.162282 | 0.000000 |
| 2019-02-28 00:00:00 | 8 | 0.452400 | 0.000000 | 508.750944 | 0.000000 |
| 2019-02-28 00:00:00 | 9 | 0.000000 | 0.022045 | 0.000000 | 24.790925 |
| 2019-02-28 00:00:00 | 10 | 0.000000 | 0.083533 | 0.000000 | 93.937870 |
| 2019-02-28 00:00:00 | 11 | 0.000000 | 0.896671 | 0.000000 | 1'008.360340 |
+---------------------------+---------+-----------------------+-----------------------+--------------------+--------------------+
我被困在想要拥有两个基本列和聚合点的地方。
答案 0 :(得分:1)
也许不是最漂亮的解决方案,但是...我正在使用两个枢轴(一个用于数量,一个用于值)到全局临时表,然后将它们联接:
Memberlist[0][1] = "abc"
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "memberNameCell", for: indexPath)
if let member = groupController.groups[indexPath.section].members[indexPath.row] as? Member
{
cell.textLabel?.text = member.name
//Memberlist[indexPath.section] = [indexPath.row:member.name]
Memberlist[indexPath.section][indexPath.row] = member.name
}
return cell
}
Create Table #tbl
(
Dt Date,
Account Int,
ISIN VarChar(20),
Quantity Float,
Val Float,
Currency VarChar(3),
Price Float,
PriceCHF Float,
FXRate Float
)
Insert Into #tbl Values
('2019-02-28 00:00:00', 1,'CH5055181629',0.00000000,0.000000,'CHF',1124.56,1124.56,1),
('2019-02-28 00:00:00', 6,'CH5055181629',0.37866100,425.827014,'CHF',1124.56,1124.56,1),
('2019-02-28 00:00:00', 7,'CH5055181629',0.67151800,755.162282,'CHF',1124.56,1124.56,1),
('2019-02-28 00:00:00', 8,'CH5055181629',0.45240000,508.750944,'CHF',1124.56,749.7067,1.5),
('2019-02-28 00:00:00', 9,'CH5055181622',0.02204500,24.790925,'CHF',1124.56,749.7067,1.5),
('2019-02-28 00:00:00',10,'CH5055181622',0.08353300,93.937870,'CHF',1124.56,749.7067,1.5),
('2019-02-28 00:00:00',11,'CH5055181622',0.89667100,1008.360340,'CHF',1124.56,749.7067,1.5)
SELECT *
INTO #assets
FROM (SELECT *
FROM #tbl) a
DECLARE @cols1 AS NVARCHAR(max)
DECLARE @cols1q AS NVARCHAR(max)
Declare @query AS NVARCHAR(max);
SET @cols1 = Stuff((SELECT DISTINCT ',' + Quotename(c.ISIN)
FROM #assets c
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, ''
)
SET @cols1q = Stuff((SELECT DISTINCT ',' + 'Cast(ISNULL(##pvt1.' + c.ISIN + ',0) As Decimal(15,6)) As ' + c.ISIN + '_Quantity'
FROM #assets c
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, ''
)
SET @query = 'SELECT dt, account, ' + @cols1
+ ' Into ##pvt1 from #assets x pivot ( max(quantity) for ISIN in (' + @cols1
+ ')) p '
EXECUTE(@query)
清理:
SELECT *
INTO #assets2
FROM (SELECT *
FROM #tbl) a
DECLARE @cols2 AS NVARCHAR(max)
DECLARE @cols2v AS NVARCHAR(max)
-- ,@query AS NVARCHAR(max);
SET @cols2 = Stuff((SELECT DISTINCT ',' + Quotename(c.ISIN)
FROM #assets2 c
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, ''
)
SET @cols2v = Stuff((SELECT DISTINCT ',' + 'Cast(ISNULL(##pvt2.' + c.ISIN + ',0) As Decimal(15,6)) As ' + c.ISIN + '_Value'
FROM #assets2 c
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, ''
)
SET @query = 'SELECT dt, account, ' + @cols2
+ ' Into ##pvt2 from #assets x pivot ( sum(val) for ISIN in (' + @cols2
+ ')) p '
EXECUTE(@query)