2017-08-25 61 views
1

我有一个数据一个SQL视图:SQL XML分组

+-----------+-------------+--------------+--------------------+------------------+-----------+----------------+--------------+-------------+----------+ 
| CarparkNo | CarparkAbbr | CarparkDesig | CountingCategoryNo | CountingCategory | FreeLimit | OccupancyLimit | CurrentLevel | Reservation | Capacity | 
+-----------+-------------+--------------+--------------------+------------------+-----------+----------------+--------------+-------------+----------+ 
|   0 | L72   | Lot 72  |     1 | Short-Term  |  174 |   175 |   87 |   0 |  175 | 
|   0 | L72   | Lot 72  |     2 | Contract   |   0 |    0 |   0 |   0 |  0 | 
|   0 | L72   | Lot 72  |     3 | Total   |  174 |   175 |   87 |   0 |  175 | 
+-----------+-------------+--------------+--------------------+------------------+-----------+----------------+--------------+-------------+----------+ 

我需要做的是寻找一个XML文件中像

<Carparks> 
    <Carpark> 
    <CarparkNo>0</CarparkNo> 
    <CarparkAbbr>L72</CarparkAbbr> 
    <CarparkDesig>Lot 72</CarparkDesig> 
    <CountingCategory> 
     <CountingCategoryNo>1</CountingCategoryNo> 
     <CountingCategory>Short-Term</CountingCategory> 
     <FreeLimit>174</FreeLimit> 
     <OccupancyLimit>175</OccupancyLimit> 
     <CurrentLevel>64</CurrentLevel> 
     <Reservation>0</Reservation> 
     <Capacity>175</Capacity> 
    </CountingCategory> 
    <CountingCategory> 
     <CountingCategoryNo>2</CountingCategoryNo> 
     <CountingCategory>Contract</CountingCategory> 
     <FreeLimit>0</FreeLimit> 
     <OccupancyLimit>0</OccupancyLimit> 
     <CurrentLevel>0</CurrentLevel> 
     <Reservation>0</Reservation> 
     <Capacity>0</Capacity> 
    </CountingCategory> 
    <CountingCategory> 
     <CountingCategoryNo>3</CountingCategoryNo> 
     <CountingCategory>Total</CountingCategory> 
     <FreeLimit>174</FreeLimit> 
     <OccupancyLimit>175</OccupancyLimit> 
     <CurrentLevel>64</CurrentLevel> 
     <Reservation>0</Reservation> 
     <Capacity>175</Capacity> 
    </CountingCategory> 
    </Carpark> 
</Carparks> 

到目前为止,我有一种说法:

SELECT [CarparkNo] 
    ,[CarparkAbbr] 
    ,[CarparkDesig] 
    ,(SELECT [CountingCategoryNo] 
     ,[CountingCategory] 
     ,[FreeLimit] 
     ,[OccupancyLimit] 
     ,[CurrentLevel] 
     ,[Reservation] 
     ,[Capacity] 
     FOR XML PATH('CountingCategory'), TYPE) 
    FROM [PARK_DB].[dbo].[CPCounting] 
    FOR XML PATH('Carpark'), ROOT('Carparks'), TYPE; 

哪种作品,但使重复<Carpark>标签,而不是保持在一个分组:

<Carparks> 
    <Carpark> 
    <CarparkNo>0</CarparkNo> 
    <CarparkAbbr>L72</CarparkAbbr> 
    <CarparkDesig>Lot 72</CarparkDesig> 
    <CountingCategory> 
     <CountingCategoryNo>1</CountingCategoryNo> 
     <CountingCategory>Short-Term</CountingCategory> 
     <FreeLimit>174</FreeLimit> 
     <OccupancyLimit>175</OccupancyLimit> 
     <CurrentLevel>82</CurrentLevel> 
     <Reservation>0</Reservation> 
     <Capacity>175</Capacity> 
    </CountingCategory> 
    </Carpark> 
    <Carpark> 
    <CarparkNo>0</CarparkNo> 
    <CarparkAbbr>L72</CarparkAbbr> 
    <CarparkDesig>Lot 72</CarparkDesig> 
    <CountingCategory> 
     <CountingCategoryNo>2</CountingCategoryNo> 
     <CountingCategory>Contract</CountingCategory> 
     <FreeLimit>0</FreeLimit> 
     <OccupancyLimit>0</OccupancyLimit> 
     <CurrentLevel>0</CurrentLevel> 
     <Reservation>0</Reservation> 
     <Capacity>0</Capacity> 
    </CountingCategory> 
    </Carpark> 
    <Carpark> 
    <CarparkNo>0</CarparkNo> 
    <CarparkAbbr>L72</CarparkAbbr> 
    <CarparkDesig>Lot 72</CarparkDesig> 
    <CountingCategory> 
     <CountingCategoryNo>3</CountingCategoryNo> 
     <CountingCategory>Total</CountingCategory> 
     <FreeLimit>174</FreeLimit> 
     <OccupancyLimit>175</OccupancyLimit> 
     <CurrentLevel>82</CurrentLevel> 
     <Reservation>0</Reservation> 
     <Capacity>175</Capacity> 
    </CountingCategory> 
    </Carpark> 
</Carparks> 

我怎么去这个格式到所需的规格?该命令在其下运行的帐户只能读取系统提供的视图。

+1

我不明白你的意思。一个标签是“停车场”,另一个是“停车场”。你重复的意思是什么? –

+0

所以'Carparks'是根,而'Carpark'是,如果/当我们有多个位置。它应该由“CarparkNo”分组。我不知道该怎么做。 –

+0

好吧。可能重复:https://stackoverflow.com/questions/18132039/sql-server-two-level-group-by-with-xml-output –

回答

1

您需要GROUP BY。简单的例子

WITH [CPCounting] AS(
     select 1 as [CarparkNo], 100 [CountingCategoryNo] , 'aa' [CountingCategory] 
     union all 
     select 1 as [CarparkNo], 200 [CountingCategoryNo] , 'bb' [CountingCategory] 
     ) 
SELECT [CarparkNo] 
    ,(SELECT [CountingCategoryNo] 
     ,[CountingCategory] 
     FROM [CPCounting] c2 
     WHERE c2.[CarparkNo] = c1.[CarparkNo] 
     FOR XML PATH('CountingCategory'), TYPE 
    ) 
    FROM [CPCounting] c1 
    GROUP BY [CarparkNo]  
    FOR XML PATH('Carpark'), ROOT('Carparks'), TYPE; 

返回

<Carparks> 
    <Carpark> 
     <CarparkNo>1</CarparkNo> 
     <CountingCategory> 
      <CountingCategoryNo>100</CountingCategoryNo> 
      <CountingCategory>aa</CountingCategory> 
     </CountingCategory> 
     <CountingCategory> 
      <CountingCategoryNo>200</CountingCategoryNo> 
      <CountingCategory>bb</CountingCategory> 
     </CountingCategory> 
    </Carpark> 
</Carparks> 
+0

添加'GROUP BY'和'WHERE'给我'列“PARK_DB。因为它不是在聚合函数或GROUP BY包含clause.' –

+0

但添加了'CarparkAbbr'和'CarparkDesig'到'GROUP需要BY'工作dbo.CPCounting.CarparkAbbr”在选择列表中无效!谢谢! –