Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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_Sql Server_Pivot - Fatal编程技术网

动态字段内容作为行Sql

动态字段内容作为行Sql,sql,sql-server,pivot,Sql,Sql Server,Pivot,我在sql数据库上有以下数据集 ---------------------------------- | ID | NAME | AGE | STATUS | ----------------------------------- | 1ASDF | Brenda | 21 | Single | ----------------------------------- | 2FDSH | Ging | 24 | Married| ------------------

我在sql数据库上有以下数据集

 ----------------------------------
|  ID   | NAME    | AGE  | STATUS |
-----------------------------------
| 1ASDF | Brenda  | 21   | Single |
-----------------------------------
| 2FDSH | Ging    | 24   | Married|
-----------------------------------
| 3SDFD | Judie   | 18   | Widow  |
-----------------------------------
| 4GWWX | Sophie  | 21   | Married|
-----------------------------------
| 5JDSI | Mylene  | 24   | Singe  |
-----------------------------------
我想查询该数据集,以便在结果中具有此结构

--------------------------------------
|  AGE  | SINGLE  | MARRIED  | WIDOW |
--------------------------------------
| 21    | 1        | 1       | 0     |
--------------------------------------
| 24    | 1        | 1       | 0     |
--------------------------------------
| 18    | 0        | 0       | 1     |
--------------------------------------
状态栏可以是动态的,这样会有更多的栏出现。
这可能吗?

因为您使用的是SQL Server,所以可以像下面这样使用
PIVOT
表操作符:

SELECT *
FROM 
(
  SELECT Age, Name, Status FROM tablename 
) AS t
PIVOT
(
  COUNT(Name)
  FOR Status IN(Single, Married, Widow)
) AS p;
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);


select @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(status)
                      FROM tablename
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');

SELECT @query = '
SELECT *
FROM 
(
  SELECT Age, Name, Status FROM tablename 
) AS t
PIVOT
(
  COUNT(Name)
  FOR Status IN( ' +@cols + ')
) AS p;';


execute(@query);


要动态执行此操作,您必须像下面这样使用动态sql:

SELECT *
FROM 
(
  SELECT Age, Name, Status FROM tablename 
) AS t
PIVOT
(
  COUNT(Name)
  FOR Status IN(Single, Married, Widow)
) AS p;
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);


select @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(status)
                      FROM tablename
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');

SELECT @query = '
SELECT *
FROM 
(
  SELECT Age, Name, Status FROM tablename 
) AS t
PIVOT
(
  COUNT(Name)
  FOR Status IN( ' +@cols + ')
) AS p;';


execute(@query);

从概念上讲,您需要一个基于状态列的轴心,按ageTnx Mahmoud进行分组!我已经测试了你的两个答案,但只有第一个问题运行良好。后来,我决定使用mssql server management studio测试这些查询,这两种方法都非常有效。当时我正在使用navicat。我想知道navicat怎么了。无论如何,这对我帮助很大。荣誉