【发布时间】:2018-12-05 18:33:23
【问题描述】:
我继承了一个网站及其对应的数据库(SQL Server)。该网站使用存储过程从数据库中提取数据。其中一个存储过程包含一个数据透视表,并且该数据透视表需要 4 多个小时才能运行。这是目前无法接受的。我正在寻求用标准 SQL 查询替换数据透视表的帮助,因为我认为这会更快并提供更好的性能。
这里是有问题的支点:
SELECT *
FROM (
SELECT ac.AID
,ac.CatName AS t
,convert(INT, ac.Code) AS c
FROM categories AS ac
) AS s
Pivot(Sum(c) FOR t IN (
[tob]
,[ecit]
,[tobwcom]
,[rnorm]
,[raddict]
,[rpolicy]
,[ryouth]
,[rhealth]
,…
)) AS p;
以及枢轴的结果
| AID | tob | ecit | tobwcom | rnorm |
|-----------|-----------|------------|---------------|-------------|
| 1 | 1 | NULL | NULL | 0 |
| 2 | 1 | NULL | NULL | 1 |
| 3 | 1 | NULL | NULL | 0 |
| 4 | 1 | NULL | NULL | 0 |
| 5 | 1 | NULL | NULL | 0 |
| 6 | 1 | NULL | NULL | 1 |
这是源表categories 和一些示例数据:
CREATE TABLE categories(
ArticleID INTEGER NOT NULL
,ThemeID INTEGER NOT NULL
,ThemeName VARCHAR(7) NOT NULL
,Code BIT NOT NULL
,CreatedTime VARCHAR(7) NOT NULL
);
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (1,1,'tob',1,'57:30.7');
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (1,2,'ecig',1,'03:58.3');
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (1,5,'rnorm',0,'42:56.5');
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (2,1,'tob',1,'57:30.7');
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (2,2,'ecig',0,'03:58.3');
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (2,5,'rnorm',1,'42:56.5');
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (2,6,'raddict',0,'42:59.8');
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (3,1,'tob',1,'57:30.7');
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (3,2,'ecig',0,'03:58.3');
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (3,5,'rnorm',0,'42:56.5');
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (21,1,'tob',1,'57:30.7');
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (21,2,'ecig',0,'03:58.3');
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (21,5,'rnorm',0,'42:56.5');
INSERT INTO categories(ArticleID,ThemeID,ThemeName,Code,CreatedTime) VALUES (21,6,'raddict',0,'42:59.8');
这是包含类别名称的表格 - (现在是 mytable)
CREATE TABLE mytable(
CatID INTEGER NOT NULL PRIMARY KEY
,CatName VARCHAR(7) NOT NULL
,CreatedTime DATETIME NOT NULL
);
INSERT INTO mytable(CatID,CatName,CreatedTime) VALUES (1,'tob','2015-03-12 10:07:54.173');
INSERT INTO mytable(CatID,CatName,CreatedTime) VALUES (2,'ecig','2015-05-18 11:48:16.297');
INSERT INTO mytable(CatID,CatName,CreatedTime) VALUES (4,'tobwcom','2015-06-19 11:12:01.537');
INSERT INTO mytable(CatID,CatName,CreatedTime) VALUES (5,'rnorm','2015-06-22 14:24:02.317');
INSERT INTO mytable(CatID,CatName,CreatedTime) VALUES (6,'raddict','2015-06-22 14:24:13.957');
INSERT INTO mytable(CatID,CatName,CreatedTime) VALUES (7,'ecit','2015-06-22 14:26:18.437');
我需要一种方法来执行枢轴在categories 中查找不存在数据的能力。输出将类似于:
| AID | tob | ecit | tobwcom | rnorm |
|-----------|-----------|------------|---------------|-------------|
| 1 | 1 | NULL | NULL | 0 |
| 2 | 1 | NULL | NULL | 1 |
或者AIDs 和没有任何值的CatNames 的列表。如:
| AID | CatName |
|-----|---------|
| 1 | ecit |
| 1 | tobwcom |
| 2 | ecit |
| 2 | tobwcom |
我试过了
select distinct(AID) FROM [categories]
where [CatName] not in ( 'ecit', 'tobwcom')
但是由此得出的结果,数字似乎并没有相加,但这可能是我的错误。
【问题讨论】:
-
这里的实际问题是什么?如果您提供一些详细信息会有所帮助。见this article。
-
@SeanLange 我很抱歉。我有这个支点,运行需要 4 个多小时(仅用于支点)。枢轴的唯一原因是找到未将类别分配给 A.I.D. 的案例。 (数据透视结果表中的空案例)。例如,我想查找尚未为
ecit或tobwcom分配值的 A.I.D.s,这将给我 A.I.D.s 1,2,3,4,5,6... 源表categories实际上没有这些案例的任何条目。那么我将如何找到不存在的条目? - 我也会用这个更新问题。 -
好吧,您的更新使这一点变得更加模糊。起初我认为这是一个性能问题。现在它看起来像别的东西。真正有帮助的是清楚地解释您要完成的工作。发布表格的详细信息也会有所帮助(比如 ddl,所以我们知道数据类型等)。最后根据样本数据得到想要的输出。
-
“类别”真的是一张表吗?还是景色?因为在标准化设置中,“AID”和“CatID”将在 1 table 中。另一个是“CatName”,以“CatID”为主键。如果是表格,那么您确定每个“CatID”只有 1 个“CatName”吗?
-
@LukStorms "categories" 是一个表格。 AID 是来自不同表的外键。是的,每个“CatID”只有 1 个“CatName”。我再次继承了这一点,我无法真正改变表格的结构方式。
标签: sql-server stored-procedures pivot