Sql 在'填写空周末;空';
我使用以下数据创建了数据库: 市场表:Sql 在'填写空周末;空';,sql,sql-server,sql-server-2008,sql-server-express,Sql,Sql Server,Sql Server 2008,Sql Server Express,我使用以下数据创建了数据库: 市场表: ID| Name | Location 1 | NYSE | USA 2 | NASDAQ | USA 3 | CME | USA 4 | Euronext| Netherlands 周末餐桌: ID| DayOff 1 | 2013-11-28 2 | 2013-12-25 3 | 2014-01-01 4 | 2014-01-21 5 | 2014-02-18 6 | 2014-03-29 7 | 2014-05-27 8 |
ID| Name | Location
1 | NYSE | USA
2 | NASDAQ | USA
3 | CME | USA
4 | Euronext| Netherlands
周末餐桌:
ID| DayOff
1 | 2013-11-28
2 | 2013-12-25
3 | 2014-01-01
4 | 2014-01-21
5 | 2014-02-18
6 | 2014-03-29
7 | 2014-05-27
8 | 2014-07-04
9 | 2014-09-02
10| NULL
m2m_市场_周末表:
market_id | weekend_id
1 | 1
1 | ...
1 | 9
2 | 1
2 | ...
2 | 9
2 | 1
3 | ...
3 | 9
5 | 10
写入查询,该查询使用相等ID对数据进行分组,并将所有日期附加到一个字符串中:
SELECT [Market].Name as [MarketName],
IsNull(STUFF((SELECT '; ' + CAST([DayOff] AS nvarchar(15)) FROM [Weekend] FOR XML PATH ('')),1, 1, ''), 'NULL') as [DayOff]
FROM [m2m_market_weekends]
INNER JOIN [Market] ON [m2m_market_weekends].[market_id] = [Market].[ID]
INNER JOIN [Weekend] ON [m2m_market_weekends].[weekend_id] = [Weekend].[ID]
GROUP BY [Market].Name
并获得:
MarketName | DayOff
NYSE | 2013-11-28; ...
NASDAQ | 2013-11-28; ...
CME | 2013-11-28; ...
Euronext | 2013-11-28; ... <-- This market have NULL value at Weekend table
MarketName | DayOff
纽约证券交易所| 2013-11-28。。。
纳斯达克| 2013-11-28。。。
CME | 2013-11-28。。。
泛欧交易所| 2013-11-28 您没有从相关子查询到主查询的链接(即,您将带回所有市场的所有周末列表)。这应该适合您:
SELECT MarketName = Market.Name,
DayOff = ISNULL(STUFF(( SELECT '; ' + CAST(DayOff AS VARCHAR(15))
FROM m2m_market_weekends m2m
INNER JOIN Weekend w
ON m2m.weekend_id = w.ID
WHERE m2m.market_id = Market.ID
ORDER BY DayOff
FOR XML PATH (''), TYPE
).value('.', 'NVARCHAR(MAX)'),
1, 1, ''),
'NULL')
FROM Market
GROUP BY Market.Name, Market.ID;
注意:我稍微更改了XML方法,因为仅使用(选择..FOR XML PATH(“”))
会导致XML字符转义(因此,如果子查询中有
,它将变为
,但是,如果使用'value
方法,即FOR XML PATH(“”),键入).value('.','NVARCHAR MAX))
XML字符被保留将ISNULL
移动到子查询内部是否有效,因此您有类似于.STUFF((选择“;”+ISNULL(强制转换([DayOff]为nvarchar(15)),'NULL')…
?@GarethD它不起作用