水平复杂的动态列?
Complex dynamic column horizontally?
我有第一个table如下
第二个table如下
我正在尝试以如下方式在 SSRS 中显示
基本上使用第一个 table 固定行数,然后使用第二个 table 动态加载列并根据 ID 相应地调整数据。
我不知道如何构建 SQL 结果的设计,以便能够像展示的那样显示
网上是否有任何样本可以引导我在这件事上找到正确的方法?
试试这个:
DECLARE @First TABLE (ID INT, Description NVARCHAR(50), Amount INT);
DECLARE @Second TABLE (ID INT, Description NVARCHAR(50), Amount INT);
INSERT INTO @First VALUES
(1, N'Cash', 50),
(2, N'CC', 20);
INSERT INTO @Second VALUES
(1, N'C1', 10),
(2, N'C2', 20),
(1, N'C3', 40);
SELECT ID, FD AS Description, FA AS Amount, C1, C2, C3
FROM
(
SELECT S.ID, S.Description SD, F.Description FD, F.Amount FA, S.Amount SA
FROM @First F FULL JOIN @Second S ON F.ID = S.ID
) P1
PIVOT
(
MAX(SA) FOR SD IN ([C1], [C2], [C3])
) P2
结果:
+----+-------------+--------+------+------+------+
| ID | Description | Amount | C1 | C2 | C3 |
+----+-------------+--------+------+------+------+
| 1 | Cash | 50 | 10 | NULL | 40 |
| 2 | CC | 20 | NULL | 20 | NULL |
+----+-------------+--------+------+------+------+
更新:动态枢轴
CREATE TABLE First (ID INT, Description NVARCHAR(50), Amount INT);
CREATE TABLE Second (ID INT, Description NVARCHAR(50), Amount INT);
DECLARE @Cols NVARCHAR(MAX), @Query NVARCHAR(MAX);
INSERT INTO First VALUES
(1, N'Cash', 50),
(2, N'CC', 20);
INSERT INTO Second VALUES
(1, N'C1', 10),
(2, N'C2', 20),
(1, N'C3', 40);
SET @Cols = STUFF((SELECT distinct ',' + QUOTENAME(S.Description)
FROM Second S
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
SET @Query = N'SELECT ID, FD AS Description, FA AS Amount, '+ @cols + '
FROM
(
SELECT S.ID, S.Description SD, F.Description FD, F.Amount FA, S.Amount SA
FROM First F FULL JOIN Second S ON F.ID = S.ID
) P1
PIVOT
(
MAX(SA) FOR SD IN ('+@Cols+')
) P2'
EXECUTE (@Query)
我有第一个table如下
第二个table如下
我正在尝试以如下方式在 SSRS 中显示
基本上使用第一个 table 固定行数,然后使用第二个 table 动态加载列并根据 ID 相应地调整数据。
我不知道如何构建 SQL 结果的设计,以便能够像展示的那样显示
网上是否有任何样本可以引导我在这件事上找到正确的方法?
试试这个:
DECLARE @First TABLE (ID INT, Description NVARCHAR(50), Amount INT);
DECLARE @Second TABLE (ID INT, Description NVARCHAR(50), Amount INT);
INSERT INTO @First VALUES
(1, N'Cash', 50),
(2, N'CC', 20);
INSERT INTO @Second VALUES
(1, N'C1', 10),
(2, N'C2', 20),
(1, N'C3', 40);
SELECT ID, FD AS Description, FA AS Amount, C1, C2, C3
FROM
(
SELECT S.ID, S.Description SD, F.Description FD, F.Amount FA, S.Amount SA
FROM @First F FULL JOIN @Second S ON F.ID = S.ID
) P1
PIVOT
(
MAX(SA) FOR SD IN ([C1], [C2], [C3])
) P2
结果:
+----+-------------+--------+------+------+------+
| ID | Description | Amount | C1 | C2 | C3 |
+----+-------------+--------+------+------+------+
| 1 | Cash | 50 | 10 | NULL | 40 |
| 2 | CC | 20 | NULL | 20 | NULL |
+----+-------------+--------+------+------+------+
更新:动态枢轴
CREATE TABLE First (ID INT, Description NVARCHAR(50), Amount INT);
CREATE TABLE Second (ID INT, Description NVARCHAR(50), Amount INT);
DECLARE @Cols NVARCHAR(MAX), @Query NVARCHAR(MAX);
INSERT INTO First VALUES
(1, N'Cash', 50),
(2, N'CC', 20);
INSERT INTO Second VALUES
(1, N'C1', 10),
(2, N'C2', 20),
(1, N'C3', 40);
SET @Cols = STUFF((SELECT distinct ',' + QUOTENAME(S.Description)
FROM Second S
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
SET @Query = N'SELECT ID, FD AS Description, FA AS Amount, '+ @cols + '
FROM
(
SELECT S.ID, S.Description SD, F.Description FD, F.Amount FA, S.Amount SA
FROM First F FULL JOIN Second S ON F.ID = S.ID
) P1
PIVOT
(
MAX(SA) FOR SD IN ('+@Cols+')
) P2'
EXECUTE (@Query)