Sql server 是否可以运行while循环来创建动态选择列

Sql server 是否可以运行while循环来创建动态选择列,sql-server,tsql,Sql Server,Tsql,我需要在查询中动态创建select列。 我知道我做错了,但不知道最好的方法是什么 DECLARE @STARTDATE DATETIME DECLARE @ENDDATE DATETIME BEGIN SELECT NAME AS FACILITY , SUM(GROU1+GROUP2) AS FAC_COUNT, --------------------ADD LOOOP HERE TO CREATE SELECT COLUMNS ?--- (SELECT COUNT(*) FROM PR

我需要在查询中动态创建select列。 我知道我做错了,但不知道最好的方法是什么

DECLARE @STARTDATE DATETIME
DECLARE @ENDDATE DATETIME

BEGIN
SELECT NAME AS  FACILITY ,
SUM(GROU1+GROUP2) AS FAC_COUNT,
--------------------ADD LOOOP HERE TO CREATE SELECT COLUMNS ?---
(SELECT COUNT(*) FROM PROGRAMS WHERE FACILITY_ID = FACILITY.ID AND PROGRAM_ID = @PROGRAM_ID
) AS PROGRAM_NAME   

----------------END LOOP?-------

FROM FACILITY
WHERE SUBTYPE IN (3,4,5)
最终结果如下所示:

您可以使用PIVOT语句,但也可以使用CASE语句进行条件聚合

SELECT fac.NAME AS FACILITY
     , SUM(fac.GROUP1 + fac.GROUP2) AS FAC_COUNT
     , SUM(CASE WHEN PROGRAM_ID = 1 THEN 1 ELSE 0 END) AS [PROGRAM 1]
     , SUM(CASE WHEN PROGRAM_ID = 2 THEN 1 ELSE 0 END) AS [PROGRAM 2]
     , SUM(CASE WHEN PROGRAM_ID = 4 THEN 1 ELSE 0 END) AS [PROGRAM 4]
FROM FACILITY fac
INNER JOIN PROGRAMS pgms ON fac.ID = pgms.FACILITY_ID
WHERE fac.SUBTYPE IN (3,4,5)

显然,如果您有1、2或4以外的程序,而不必手动更改代码,那么这将不会灵活使用。为了适应这一点,您应该查看所讨论的动态透视查询。

该查询应该回答哪些问题?表的模式是什么?查询是为了显示每个设施的程序参与者的数量。主表是包含所列设施的设施表、包含项目的项目表和包含项目参与者的参与者表