使用多个PIVOT列,不同的名称和汇总进行查询

时间:2019-04-24 11:35:28

标签: sql sql-server pivot sql-server-2016

我有一个名为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'。 此外,我希望数量值不是针对每一行,而是针对每个DateAccount进行汇总

所以,我当前的结果如下:

+---------------------------+---------+--------------+----------------+
|           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       |
+---------------------------+---------+-----------------------+-----------------------+--------------------+--------------------+

我被困在想要拥有两个基本列和聚合点的地方。

1 个答案:

答案 0 :(得分:1)

也许不是最漂亮的解决方案,但是...我正在使用两个枢轴(一个用于数量,一个用于值)到全局临时表,然后将它们联接:

表格:

Memberlist[0][1] = "abc"

数据点1:

  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

    }

枢轴2:

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)