0

すべてのシステム テーブルで発生するすべての変更をログに記録する監査システムがあります。基本的に、AuditLog テーブルは次のようになります。

ここに画像の説明を入力

現在、さまざまな種類の情報を照会するために、いくつかの SQL ビューを作成しています。1点を除いてすべてOKです。画像をもう一度見ると、2 つのフィールド (MetaName と MetaValue) を持つキーと値のペアのテーブルである SubscriptionMetadata テーブルがあることがわかります。画像が示すのは、サブスクリプションに「ライセンスされたコピー: フルネーム、会社、V...」という値の新しい透かしがあることです。

私が必要としているのは、私の見解では、これら 2 つの行を次の形式で 1 ​​つに変換することです。

41 - Insert - SubscriptionMetadata - 2012-10-19 - 53DA4XXXXXX - Watermark -  Licensed copy: Fullname, Company, V...

どうすればそれができるか、または検索できるか、本当に想像できません。

もう 1 つの問題 (私が思うに) があります。これらの行は常に、最初に MetaName、次に MetaValue という順序で表示されます。それが彼らが関連していることを知る唯一の方法です。

私を手伝ってくれますか?

4

3 に答える 3

1

完全なテーブル構造を見ることはできませんが、次の方法でデータを変換できます。これらのソリューションは両方とも、データを別々の列に配置します。

;with data(id, [action], [type], [date], [col], metatype, value) as
(
    select 41, 'Insert', 'SubscriptionMetaData', '2012-10-19', '53DA4XXX','Metaname', 'Watermark'
    union all
    select 41, 'Insert', 'SubscriptionMetaData', '2012-10-19', '53DA4XXX','MetaValue', 'Licensed copy: Fullname, Company'
) 
select id, action, type, date, col,
    MAX(case when metatype = 'Metaname' then value end) Name,
    MAX(case when metatype = 'MetaValue' then value end) Value
from data
group by id, action, type, date, col

デモで SQL Fiddle を参照してください

またはPIVOT、データに対して a を使用して同じ結果を得ることができます。

;with data(id, [action], [type], [date], [col], metatype, value) as
(
    select 41, 'Insert', 'SubscriptionMetaData', '2012-10-19', '53DA4XXX','Metaname', 'Watermark'
    union all
    select 41, 'Insert', 'SubscriptionMetaData', '2012-10-19', '53DA4XXX','MetaValue', 'Licensed copy: Fullname, Company'
) 
select *
from
(
    select id, [action], [type], [date], [col], metatype, value
    from data
) src
pivot
(
    max(value)
    for metatype in (Metaname, MetaValue)
) piv

デモで SQL Fiddle を参照してください

どちらも同じ結果になります。

| ID | ACTION |                 TYPE |       DATE |      COL |      NAME |                            VALUE |
-------------------------------------------------------------------------------------------------------------
| 41 | Insert | SubscriptionMetaData | 2012-10-19 | 53DA4XXX | Watermark | Licensed copy: Fullname, Company |
于 2012-12-13T14:44:47.147 に答える
0

次のように、ストアド プロシージャまたはスカラー値関数を使用して、coalesce 関数を使用してこれを行うことができます。

DECLARE @Results NVARCHAR(MAX);
DECLARE @Token NVARCHAR(5) = '-'; -- separator token
SELECT @Results = coalesce(@Results + @Token,'') + t.MetaValue from (select * from TableName where MetaName = 'SubscriptionMetadata') t;
RETURN @Results; -- variable containing the concatenated values
于 2012-12-13T14:48:21.393 に答える
0

これが実際の例です。必要に応じて列名を置き換えてください。Col3 = your string concatenating column.

SELECT t1.col1,t1.col2,
       NameValue =REPLACE( (SELECT col3 AS [data()]
           FROM mytable t2
           WHERE t2.col1 = t1.col1
           ORDER BY t2.col1
           FOR XML PATH('')
           ), ' ', ' : ')
FROM mytable t1
GROUP BY col1,col2 ;

--DATA
1 |  X |  Name
1 |  X |  Value

--RESULTS
1 |  X |  Name:Value --Name Value pair here

編集:連結が必要ない場合 (コメントに従って)

SELECT t1.col1, t1.col2, t1.col3 NameColumn, t2.col3 ValueColumn
FROM (SELECT * FROM myTable WHERE col3 = 'Watermark') t1 JOIN 
     (SELECT * FROM myTable WHERE NOT (col3 = 'Watermark')) t2 
     ON t1.col1 = t2.col1
于 2012-12-13T14:49:16.330 に答える