如何将一列(在一个表变量中并且具有作用于该变量的列)连接到永久表中的一列?

时间:2019-01-30 19:16:57

标签: sql-server tsql

这是我用来创建表变量的代码

DECLARE @attribute_table  
TABLE (attributeId VARCHAR(100) NOT NULL, EventId VARCHAR(100) NOT NULL, EVENT_TEACHERS VARCHAR(100) NOT NULL);

INSERT INTO @attribute_table 
SELECT attributeID, EventId, attributeValue as EVENT_TEACHERS
FROM dbo.retreatSuiteEventAttributes
WHERE attributeName LIKE '%EVENT_TEACHERS%'


select t1.attributeId, t1.EventId, i.EVENT_TEACHERS
from  @attribute_table t1
outer apply dbo.teacherstring3(t1.EVENT_TEACHERS, '|') i

(teacherstring3是一个将EVENT_TEACHER值基本上拆分为不同行并删除了分隔符的函数)

我得到的答案只是修改上面的select语句。我想要的是将该语句的结果加入(或与之集成)到下面完整显示的主select语句。

我想使用具有作用于其上的功能的列-> i.EVENT_TEACHERS(FK)列连接到另一个(永久)表,该表在下面所示的SELECT语句中具有相应的TeacherIds(PK)。 我该怎么做?

这是创建表变量后我要执行的完整查询(我将同时执行它们)。它不起作用,在GROUP附近我也得到了不正确的语法。

 SELECT FORMAT(b.eventStartDate, 'd') as 'Start Date',
dbo.CategoryString(CAST(attributeValue as VARCHAR)) as Categories, 
b.EventName as 'Event Name', 
d.FirstName + ' ' + d.LastName as Teacher, 
b.spacesAvailable as Capacity, 
SUM(a.numberOfPlaces) as 'Participants', 
FORMAT(CAST(SUM(a.numberOfPlaces) as FLOAT)/CAST(b.spacesAvailable as FLOAT), 'p') as Occupancy,
FORMAT(SUM(a.totalCost), 'C') as Cost,
FORMAT(SUM(a.totalPaid), 'C') as Paid,
FORMAT(SUM(a.discountAmount), 'C') as Scholarships,
FORMAT(SUM(a.Donation), 'C') as Gifts,
FORMAT(SUM(a.totalPaid)/SUM(a.numberOfPlaces), 'C') as 'Revenue Per Seat'
  FROM [dbo].[RetreatSuiteRegistrations] a join [dbo].[RetreatSuiteEvents] b on a.EventId = b.EventId AND a.registrationStatusId=1 AND b.spacesAvailable > 0
  JOIN [dbo].[RetreatSuiteEventAttributes] c on a.EventId = c.EventId AND c.attributeName='EVENT_CATEGORIES'
  JOIN @attribute_table t1 outer apply dbo.teacherstring3(t1.EVENT_TEACHERS, '|') i
  JOIN [dbo].[RetreatSuiteTeacher] d on  i.EVENT_TEACHERS = d.TeacherID
  GROUP BY b.eventStartDate, dbo.CategoryString(CAST(attributeValue as VARCHAR)), b.EventName, d.FirstName + ' ' + d.LastName, b.spacesAvailable
  ORDER BY b.eventStartDate desc

    DROP Function IF EXISTS CategoryString
go

1 个答案:

答案 0 :(得分:0)

也许只需添加一个哑子查询,如:

SELECT
  FORMAT(b.eventStartDate, 'd')                                                          AS [Start Date]
  , dbo.CategoryString(CAST(attributeValue AS VARCHAR))                                  AS Categories
  , b.EventName                                                                          AS [Event Name]
  , d.FirstName + ' ' + d.LastName                                                       AS Teacher
  , b.spacesAvailable                                                                    AS Capacity
  , SUM(a.numberOfPlaces)                                                                AS Participants
  , FORMAT(CAST(SUM(a.numberOfPlaces) AS FLOAT) / CAST(b.spacesAvailable AS FLOAT), 'p') AS Occupancy
  , FORMAT(SUM(a.totalCost), 'C')                                                        AS Cost
  , FORMAT(SUM(a.totalPaid), 'C')                                                        AS Paid
  , FORMAT(SUM(a.discountAmount), 'C')                                                   AS Scholarships
  , FORMAT(SUM(a.Donation), 'C')                                                         AS Gifts
  , FORMAT(SUM(a.totalPaid) / SUM(a.numberOfPlaces), 'C')                                AS [Revenue Per Seat]
FROM dbo.RetreatSuiteRegistrations                                   a
  JOIN dbo.RetreatSuiteEvents                                        b ON a.EventId = b.EventId
                                                                         AND a.registrationStatusId = 1
                                                                         AND b.spacesAvailable > 0
  JOIN dbo.RetreatSuiteEventAttributes                               c ON a.EventId = c.EventId
                                                                         AND c.attributeName = 'EVENT_CATEGORIES'
  JOIN (SELECT
          t1.attributeId
          , t1.EventId
          , i.EVENT_TEACHERS
        FROM @attribute_table                                    t1
          OUTER APPLY dbo.teacherstring3(t1.EVENT_TEACHERS, '|') i ) AS MyTest ON c.EventId = MyTest.EVENT_TEACHERS
  JOIN dbo.RetreatSuiteTeacher                                       d ON MyTest.EVENT_TEACHERS = d.TeacherID
GROUP BY
  b.eventStartDate
  , dbo.CategoryString(CAST(attributeValue AS VARCHAR))
  , b.EventName
  , d.FirstName + ' ' + d.LastName
  , b.spacesAvailable
ORDER BY b.eventStartDate DESC;

DROP FUNCTION IF EXISTS CategoryString;
GO