2017-01-10 46 views
1

私は、単一のテーブル、単一の行を照会し、結果をカンマの別の文字列として返します。クエリ結果としてのSQL CSV列

Forms 
1, 10, 4 

SQL:

DECLARE @tmp varchar(250) 
SET @tmp = '' 
SELECT @tmp = @tmp + Form_Number + ', ' 
FROM Facility_EI_Forms_Required 
WHERE Facility_ID = 11 AND EI_Year=2012 -- single Facility, single year 
SELECT SUBSTRING(@tmp, 1, LEN(@tmp) - 1) AS Forms 

Facility_EI_Forms_RequiredテーブルはFacility_ID = 11

Facility_ID EI_Year Form_Number 
11 2012 1 
11 2012 10 
11 2012 4 

Form_numberための3つのレコードを有するvarchar型のフィールドです。

私はFacility_IDとFacility_Name ++を持つFacilityテーブルを持っています。

特定の年のすべての施設を照会し、CSV出力フィールドを作成するクエリを作成するにはどうすればよいですか?

私はこれまでのところ、これを持っている:

DECLARE @tmp varchar(250) 
SET @tmp = '' 
SELECT TOP 100 A.Facility_ID, A.Facility_Name, 
    (
    SELECT @tmp = @tmp + B.Form_Number + ', ' 
    FROM B 
    WHERE B.Facility_ID = A.Facility_ID 
    AND B.EI_Year=2012 
    ) 
FROM Facility A, Facility_EI_Forms_Required B 

をしかし、それは私の推測では、これは、クエリやストアドプロシージャのためのタスクが必要とすることができる、あまりにも複雑である

を@tmp使用して構文エラーを取得しますSPの知識はほとんどありません。ネストされたクエリでこれを行うことはできますか?


私はそれが唯一の代わりに、3つのすべての最初のレコードを返している。コールに

ALTER FUNCTION [dbo].[sp_func_EI_Form_List] 
(
    -- Add the parameters for the function here 
    @p1 int, 
    @pYr int 
) 
RETURNS varchar 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @Result varchar 

    -- Add the T-SQL statements to compute the return value here 
    DECLARE @tmp varchar(250) 
    SET @tmp = '' 
    SELECT @tmp = @tmp + Form_Number + ', ' 
    FROM OIS..Facility_EI_Forms_Required 
    WHERE Facility_ID = @p1 AND EI_Year = @pYr -- single Facility, single year 

    SELECT @Result = @tmp -- SUBSTRING(@tmp, 1, LEN(@tmp) - 1)-- @p1 

    -- Return the result of the function 
    RETURN @Result 

END 

select Facility_ID, Facility.Facility_Name, 
    dbo.sp_func_EI_Form_List(Facility_ID,2012) 
from facility where Facility_ID=11 

戻り

Facility_ID Facility_Name Form_List 
11 Hanson Aggregates 1 

をスカラー値機能を試してみました私は間違って何をしていますか?

答えて

1

これは、SO回答Concatenate many rows into a single text stringと同様の方法です。スキーマとデモデータを持たないと試してみることができないので、正しいと思います(おそらくスキーマとデータを質問に追加できます)。

Select distinct A.Facility_ID, A.Facility_Name, 
    substring(
     (
      Select ',' + B.Form_Number AS [text()] 
      From Facility_EI_Forms_Required B 
      Where B.Facility_ID = A.Facility_ID 
      AND B.EI_Year=2012 
      ORDER BY B.Facility_ID 
      For XML PATH ('') 
     ), 2, 1000) [Form_List] 
From Facility A 
+0

Worked great! 'For XML ...'は黒い魔法のIMOのビットです。結果は得られるが、方法については手がかりがない。正規表現と同じクラスで私は推測する。 – rheitzman

関連する問題