我有一个格式的sql表;
Name Date Value
ABC 1/21/2015 52
ABC 1/22/2015 12
ABC 1/23/2015 32
DEF 1/21/2015 78
DEF 1/22/2015 53
etc...
为了与遗留程序兼容,我需要格式化文本文件,如下所示:
ABC
1/21/2015,52
1/22/2015,12
1/23/2015,32
DEF
1/21/2015,78
1/22/2015,53
任何建议都会有所帮助。
答案 0 :(得分:8)
一种选择是使用UNION
为结果集创建标题行,然后进行排序,使其显示在每个Name
组的顶部。您可以使用计算列来执行此操作,该列将这些生成的行标识为标题。
SELECT CASE WHEN t.Header = 1
THEN t.Name
ELSE CONCAT(t.Date, ',', t.Value)
END
FROM
(
SELECT DISTINCT Name, NULL AS Date, NULL AS Value, 1 AS Header
FROM yourTable
UNION ALL
SELECT Name, Date, Value, 0 AS Header
FROM yourTable
) t
ORDER BY t.Name, t.Header DESC, t.Date
答案 1 :(得分:3)
这是一个非常黑客,但结果是你需要的:
诀窍是,使用这种形式的中间XML:
<x>ABC</x>
<x>2015.01.21,52</x>
<x>2015.01.22,12</x>
<x>2015.01.23,32</x>
<x>DEF</x>
<x>2015.01.21,78</x>
<x>2015.01.22,53</x>
然后很容易阅读每个&#34;节点&#34;:
SET LANGUAGE ENGLISH;
DECLARE @tbl TABLE(Name VARCHAR(100),Date DATE,Value INT);
INSERT INTO @tbl VALUES
('ABC','1/21/2015',52)
,('ABC','1/22/2015',12)
,('ABC','1/23/2015',32)
,('DEF','1/21/2015',78)
,('DEF','1/22/2015',53);
WITH DistinctNames AS
(
SELECT DISTINCT NAME
FROM @tbl
)
SELECT One.Line.value('.','varchar(100)') AS OneLine
FROM
(
SELECT
(
SELECT Name AS [x]
,(
SELECT CONVERT(VARCHAR(10),t.Date,102) + ',' + CAST(t.Value AS VARCHAR(100))
FROM @tbl AS t
WHERE t.Name=DistinctNames.Name
FOR XML PATH('x'),TYPE
)
FROM DistinctNames
FOR XML PATH(''),TYPE
)
) AS tbl(x)
CROSS APPLY x.nodes('/x') AS One(Line)
答案 2 :(得分:2)
为我解决这个问题的最简单方法是使用查询。
SELECT Name, Date, Value
FROM Table
ORDER BY Name ASC, Date ASC
然后使用一个简短的PHP脚本,每次获取一个新的名称,回复它并转储所有行,直到找到一个新的名称。
<?php
// SQL
$name = "";
foreach ($response as &$line) {
if ($name != $line['Name']) {
$line['Name'] = $name;
echo $name . "<br />";
}
echo $line['Date'] . "," . $line['Value'] . "<br/>";
}
?>
并将其保存为文本文件。
注意:您可以使用&#34;百万&#34;不同的语言。我刚用PHP编写,因为对我来说它是最容易访问的。我的想法对其他人来说也是一样的。