Как я могу сделать SQL PIVOT форматирование результата в зависимости от состояния поля? - PullRequest
0 голосов
/ 02 июня 2019

У меня есть следующие данные в запросе, который требует дальнейшей работы

Id          User                    Application           CompanyId         ApplicationId Restricted
----------- ----------------------- --------------------- ----------------- ------------- -----------
1           yes@way.com             members               4027              1             0           
2           dg@spw.com              members               1104              1             0
3           dg@spw.com              reports               1104              2             0 
4           dg@spw.com              identity              1104              3             0
5           dg@spw.com              landing page          1104              4             0
6           dg@spw.com              authorization         1104              7             0
7           jtize@sssssss.com       members               1104              1             0
8           jtize@sssssss.com       reports               1104              2             0
9           jtize@sssssss.com       identity              1104              3             0
10          jtize@sssssss.com       landing page          1104              4             1

Мне удалось получить следующее с помощью SQL PIVOT, но это не совсем удовлетворяет потребности приложения.

PIVOT Query (обратите внимание, что результаты были усечены для упрощения)

WITH UserData AS
(
 SELECT ISNULL(CAST((ROW_NUMBER() OVER (order by u.Id, a.Id)) as int), 0) 
        as Id, u.UserName AS [User], 
        a.Description AS Application, ca.CompanyId, u.Id AS UserId, a.Id AS ApplicationId
    FROM  dbo.Application AS a LEFT OUTER JOIN
        dbo.CompanyApplication AS ca ON ca.ApplicationId = a.Id RIGHT OUTER JOIN
        dbo.AspNetUsers AS u ON u.CompanyId = ca.CompanyId
)
SELECT *

  FROM (
  SELECT [User], [CompanyId], [ApplicationId], [Application]
  FROM  (SElect * from UserData where id < 13) x
) as s
PIVOT (
  MIN([ApplicationId])
  FOR [Application] in (
    [members], [identity], [admin], [contractor qualification], [audits], 
         [landing page], [sitetracker], [reports], [authorization]
  )
) 
as pvt

Результаты:

User                members  identity  landing page  reports     authorization
------------------- -------- --------- ------------  ----------- -------------
dg@spw.com          1        3         4             2           7
jtize@sssssss.com   1        3         4             2           0
yes@way.com         1        NULL      NULL          NULL        NULL

Реальный результат должен быть одним из трех значений (applicationid, 0,и -1).Необходимый результат выглядит следующим образом:

User                members  identity  landing page  reports     authorization
------------------- -------- --------- ------------  ----------- -------------
dg@spw.com          1        3         4             2           7
jtize@sssssss.com   1        3        -1             2           0
yes@way.com         1        0         0             0           0

Обратите внимание, что -1 для ограниченного столбца

1 Ответ

0 голосов
/ 02 июня 2019

Если я предполагаю, что вы хотите заменить [ApplicationId] на -1, когда Restricted = 1, то следующий скрипт даст желаемый результат:

SELECT [user],
members,
ISNULL([identity],0) AS [identity],
ISNULL([landing page],0) AS [landing page],
ISNULL([reports],0) AS [reports],
ISNULL([authorization],0) AS [authorization]
FROM 
(
    SELECT [User], 
    [CompanyId], 
    CASE WHEN Restricted = 1 THEN -1 ELSE [ApplicationId] END [ApplicationId], 
    [Application]
    FROM  UserData
    WHERE id < 13
) AS s
PIVOT
(
    SUM([ApplicationId])
    FOR [Application] in 
    (
        [members], [identity], [admin], [contractor qualification], [audits], 
        [landing page], [sitetracker], [reports], [authorization]
    )
) AS pvt

Вывод:

user                members identity    landing page    reports authorization
dg@spw.com          1       3           4               2       7
jtize@sssssss.com   1       3           -1              2       0
yes@way.com         1       0           0               0       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...