Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-每行一项_Sql_Unpivot - Fatal编程技术网

SQL-每行一项

SQL-每行一项,sql,unpivot,Sql,Unpivot,我有一个名为Registers的表,包含3个字段,如下所示: Select PersonID, RegisterID, Status from Registers PersonID RegisterID Status ------------------------------- 3049518 14467 A 3049518 14467 B 3049518 14467 C 3049518 32445 A

我有一个名为Registers的表,包含3个字段,如下所示:

Select PersonID, RegisterID, Status from Registers

PersonID    RegisterID  Status
-------------------------------
3049518     14467       A
3049518     14467       B
3049518     14467       C
3049518     32445       A
3049518     32445       B
3049518     32445       C
是否有一种简单的方法在单行上显示每个寄存器及其状态?乙二醇

PersonID    RegisterID  Status1 Status2 Status3
------------------------------------------------
3049518     14467       A       B       C
3049518     32445       A       B       C

提前谢谢。

你可以这样做

  SELECT SUBSTRING((SELECT   ',' + CONVERT(VARCHAR , Status)       
                                                            FROM DBO.Registers WITH (NOLOCK)

                                                            FOR XML PATH('')),2,20000)),'')

或者提供sql FIDLE,这样我就可以编写完整的查询了

如果您有固定数量的状态,并且您知道状态值,那么在使用以下代码之后,您就可以得到您想要的

CREATE TABLE #Register(PersonID int, RegisterID int, Stat varchar)

INSERT INTO #Register (PersonID,RegisterID,Stat) VALUES
('3049518','14467','A'),
('3049518','14467','B'),
('3049518','14467','C'),
('3049518','32445','A'),
('3049518','32445','B'),
('3049518','32445','C')

SELECT PersonID
    ,RegisterID
    ,MAX(A) 'A'
    ,MAX(B) 'B'
    ,MAX(C) 'C'
FROM (
    SELECT PersonID
        ,RegisterID
        ,CAST(CASE 
                WHEN r.stat = 'A'
                    THEN 'A'
                ELSE NULL
                END AS VARCHAR) AS 'A'
        ,CAST(CASE 
                WHEN r.stat = 'B'
                    THEN 'B'
                ELSE NULL
                END AS VARCHAR) AS 'B'
        ,CAST(CASE 
                WHEN r.stat = 'C'
                    THEN 'C'
                ELSE NULL
                END AS VARCHAR) AS 'C'
    FROM #Register r
    GROUP BY PersonID
        ,RegisterID
        ,Stat
    ) q
GROUP BY q.PersonID
    ,q.RegisterID
代码假定每个状态下每个人有一条记录

它输出

如果状态值不是固定的,并且您不知道它们是什么,则可以在SQL Server中使用以下选项:

CREATE TABLE #Register(PersonID int, RegisterID int, Stat varchar)

INSERT INTO #Register (PersonID,RegisterID,Stat) VALUES
('3049518','14467','A'),
('3049518','14467','B'),
('3049518','14467','C'),
('3049518','32445','A'),
('3049518','32445','B'),
('3049518','32445','C')


DECLARE @queryPart1 NVARCHAR(MAX)
    ,@queryPart2 NVARCHAR(MAX)
    ,@colHeader NVARCHAR(MAX)
    ,@query NVARCHAR(MAX)

SET @queryPart1 = 'SELECT PersonID,RegisterID'
SET @queryPart2 = 'FROM (SELECT PersonID,RegisterID'
SET @query = ''

DECLARE Stat_Cursor CURSOR
FOR
SELECT DISTINCT (STAT)
FROM #Register r

OPEN Stat_Cursor;

FETCH NEXT
FROM Stat_Cursor
INTO @colHeader

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @queryPart1 = @queryPart1 + ',MAX(''' + @colHeader + ''') ''' + @colHeader + ''''
    SET @queryPart2 = @queryPart2 + ',CAST(CASE WHEN r.stat = ''' + @colHeader + ''' THEN ''' + @colHeader + ''' ELSE NULL END AS VARCHAR) AS ''' + @colHeader + ''''

    FETCH NEXT
    FROM Stat_Cursor
    INTO @colHeader
END;

CLOSE Stat_Cursor;

DEALLOCATE Stat_Cursor;

SET @query = @queryPart1 + @queryPart2 + 'FROM #Register r GROUP BY PersonID ,RegisterID,Stat) q'

PRINT @query
GO

如果您使用Oracle,以下是一个解决方案:

    select * from ( 
    select PersonID,RegisterID, Status
   from test t
)
pivot 
(
   count(Status)
   for Status in ('A' as "Status1",'B' "Status2",'C' "Status3")
)
order by 1

状态列中的值列表是预先确定且不变的,还是完全动态的?这将显著改变答案的复杂性。您使用的是哪种数据库管理系统?博士后?Oracle?您如何知道哪种状态是1、2或3?如果有第四种状态怎么办?请定义
状态
?感谢大家的回复。对不起,我应该说-我使用的是SQL Server 2008 R2。状态值是固定的,只有3个(A、B、C)。状态的含义是:A=存在,B=不存在,C=Late@Jim刚刚看到这个评论,但是我在下面添加了一个动态版本的查询。