在SQL server中透视两个表而不进行聚合

在SQL server中透视两个表而不进行聚合,sql,sql-server,Sql,Sql Server,我在将行转换为列时遇到问题 我的结构是这样的: SELECT [ID_KPI] ,[KPI_VALUE] FROM [dbo].[FACT_KPI] SELECT ID_KPI ,KPI_LABEL FROM [dbo].[DIM_KPI] 以及我努力实现的成果 SELECT [nb_departure] ,[nb_arrival] ,[headcount] FROM [dbo].[FACT_HR] 您可以使用CTE或派生表以及一些条

我在将行转换为列时遇到问题

我的结构是这样的:

SELECT 
    [ID_KPI]
   ,[KPI_VALUE]
FROM [dbo].[FACT_KPI]

SELECT 
    ID_KPI
   ,KPI_LABEL
FROM [dbo].[DIM_KPI]

以及我努力实现的成果

SELECT 
    [nb_departure]
   ,[nb_arrival]
   ,[headcount]
FROM [dbo].[FACT_HR]

您可以使用CTE或派生表以及一些条件聚合来完成此操作。我不知道你没有聚合的意思,我不确定没有聚合是否可能:

CTE:

派生表:

CREATE TABLE FACT_KPI (ID_KPI int, KPI_VALUE int)
CREATE TABLE DIM_KPI (ID_KPI int, KPI_LABEL varchar(25))

INSERT INTO FACT_KPI VALUES (1,25)
                        ,(1,30)
                        ,(2,15)
                        ,(2,7)
                        ,(3,12)
                        ,(3,13)

INSERT INTO DIM_KPI VALUES (1, 'nb_departure')
                       ,(2, 'nb_arrival')
                       ,(3, 'headcount')
SELECT CASE WHEN ID_KPI = 1 THEN KPI_VALUE END AS nb_departure,
   CASE WHEN ID_KPI = 2 THEN KPI_VALUE END AS nb_arrival,
   CASE WHEN ID_KPI = 3 THEN KPI_VALUE END AS headcount
FROM       
(SELECT F_KPI.ID_KPI, KPI_VALUE, KPI_LABEL
FROM FACT_KPI F_KPI
INNER JOIN DIM_KPI ON F_KPI.ID_KPI = DIM_KPI.ID_KPI) FACT_KPI

其他注意事项,请下次使用ASCII表格,并请阅读注释。

您可以使用pivot,如下所示:

Select nb_departure, nb_arrival, headcount from (
    Select d.KPI_LABEL, f.KPI_VALUE
    , RowN = Row_Number() over(order by d.id_kpi)
        from dbo.Fact_KPI f
        join dbo.Dim_KPI d
        on f.ID_KPI = d.ID_KPI
) a
pivot (max(kpi_value) for kpi_label in ([nb_departure],[nb_arrival],[headcount])) p
+--------------+------------+-----------+
| nb_departure | nb_arrival | headcount |
+--------------+------------+-----------+
| 25           | NULL       | NULL      |
| 30           | NULL       | NULL      |
| NULL         | 15         | NULL      |
| NULL         | 7          | NULL      |
| NULL         | NULL       | 12        |
| NULL         | NULL       | 13        |
+--------------+------------+-----------+
输出如下:

Select nb_departure, nb_arrival, headcount from (
    Select d.KPI_LABEL, f.KPI_VALUE
    , RowN = Row_Number() over(order by d.id_kpi)
        from dbo.Fact_KPI f
        join dbo.Dim_KPI d
        on f.ID_KPI = d.ID_KPI
) a
pivot (max(kpi_value) for kpi_label in ([nb_departure],[nb_arrival],[headcount])) p
+--------------+------------+-----------+
| nb_departure | nb_arrival | headcount |
+--------------+------------+-----------+
| 25           | NULL       | NULL      |
| 30           | NULL       | NULL      |
| NULL         | 15         | NULL      |
| NULL         | 7          | NULL      |
| NULL         | NULL       | 12        |
| NULL         | NULL       | 13        |
+--------------+------------+-----------+

这是一个很好的起点。