表1:
编号  名称
01    A
02    B
03    C表2:
编号   日期         备注
0001  2008-10-1  |A|B|
0002  2008-10-2  |A|C|
0001  2008-10-2  |B|C|
0003  2008-10-2  |A|B|C|
0002  2008-10-3  |B|C|想得到如下结果:日期         名称     数量
2008-10-1   A       1
2008-10-1   B       1
2008-10-2   A       2
2008-10-2   B       2
2008-10-2   C       3
2008-10-3   A       0
2008-10-3   B       1
2008-10-3   C       1另外说明一下关系,表2的备注字段内容即为表1的名称字段值和“|”的组合。比较着急,还望各位出手相助。

解决方案 »

  1.   

    --> liangCK小梁 于2008-10-23
    --> 生成测试数据: #tb1
    IF OBJECT_ID('tempdb.dbo.#tb1') IS NOT NULL DROP TABLE #tb1
    CREATE TABLE #tb1 (编号 VARCHAR(2),名称 VARCHAR(1))
    INSERT INTO #tb1
    SELECT '01','A' UNION ALL
    SELECT '02','B' UNION ALL
    SELECT '03','C'
    --> liangCK小梁 于2008-10-23
    --> 生成测试数据: #tb2
    IF OBJECT_ID('tempdb.dbo.#tb2') IS NOT NULL DROP TABLE #tb2
    CREATE TABLE #tb2 (编号 VARCHAR(4),日期 DATETIME,备注 VARCHAR(10))
    INSERT INTO #tb2
    SELECT '0001','2008-10-1','|A|B|' UNION ALL
    SELECT '0002','2008-10-2','|A|C|' UNION ALL
    SELECT '0001','2008-10-2','|B|C|' UNION ALL
    SELECT '0003','2008-10-2','|A|B|C|' UNION ALL
    SELECT '0002','2008-10-3','|B|C|'--SQL查询如下:;WITH Liang 
    AS
    (
        SELECT a.编号,日期,b.备注
        FROM
        (
             SELECT 编号,日期,
                  CAST('<root><v>'
                       +REPLACE(STUFF(LEFT(备注,LEN(备注)-1),1,1,''),'|','</v><v>')
                              +'</v></root>' AS XML) AS v
             FROM #tb2
        ) AS a
        CROSS APPLY
        (
             SELECT c.value('.','varchar(10)') AS 备注
             FROM a.v.nodes('/root/v') AS T(c)
        ) AS b
    )
    SELECT CONVERT(VARCHAR(10),日期,120) 日期,备注,
           COUNT(*) 数量 
    FROM Liang
    GROUP BY CONVERT(VARCHAR(10),日期,120),备注
    ORDER BY 日期;/*
    日期         备注         数量
    ---------- ---------- -----------
    2008-10-01 A          1
    2008-10-01 B          1
    2008-10-02 A          2
    2008-10-02 B          2
    2008-10-02 C          3
    2008-10-03 B          1
    2008-10-03 C          1(7 行受影响)*/