在SQL Server 2005中使用什么更有效:PIVOT还是MULTIPLE JOIN?
例如,我使用两个连接获得此查询:
SELECT p.name, pc1.code as code1, pc2.code as code2
FROM product p
INNER JOIN product_code pc1
ON p.product_id=pc1.product_id AND pc1.type=1
INNER JOIN product_code pc2
ON p.product_id=pc2.product_id AND pc2.type=2
Run Code Online (Sandbox Code Playgroud)
我可以使用PIVOT做同样的事情:
SELECT name, [1] as code1, [2] as code2
FROM (
SELECT p.name, pc.type, pc.code
FROM product p
INNER JOIN product_code pc
ON p.product_id=pc.product_id
WHERE pc.type IN (1,2)) prods1
PIVOT(
MAX(code) FOR type IN ([1], [2])) prods2
Run Code Online (Sandbox Code Playgroud)
哪一个会更有效率?
我正在使用MS SQL 2008 R2,有三个表具有以下模式:
表1:包含每个工作人员的工作班次信息
CREATE TABLE workshift (
[ws_id] [bigint] NOT NULL,
[start_date] [datetime] NOT NULL,
[end_date] [datetime] NOT NULL,
[worker_id] [bigint] NOT NULL
)
INSERT INTO workshift VALUES (1, '2012-08-20 08:30:00', '2012-08-20 14:30:00', 1)
INSERT INTO workshift VALUES (2, '2012-08-20 14:30:00', '2012-08-20 22:30:00', 2)
Run Code Online (Sandbox Code Playgroud)
表2:包含货币面额
CREATE TABLE currency_denom (
[cd_id] [decimal](7, 2) NOT NULL,
[name] [nchar](100) NOT NULL
)
INSERT INTO currency_denom VALUES (1, '100.00')
INSERT INTO currency_denom VALUES (2, '50.00')
INSERT INTO currency_denom VALUES (3, '20.00')
INSERT …Run Code Online (Sandbox Code Playgroud) 我有一张选票,每个选民从 10 位不同的候选人中选出 3 票。第 1 票得 3 分,第 2 票得 2 分,第 3 票得 1 分。
我有以下 SQL 查询来计算从每张投票中获得的总分(因此将投票 1、2 和 3 的结果分开)。
我需要做的是将所有这些结果放在一个表中,但我不太确定从哪里开始。
SELECT cn.cand_name, (count(vote_1) * 3) as vote_1 FROM candidate_votes cv Inner Join candidate_names cn ON cv.vote_1 = cn.cand_number GROUP BY cand_name;
SELECT cn.cand_name, (count(vote_2) * 2) as vote_2 FROM candidate_votes cv Inner Join candidate_names cn ON cv.vote_2 = cn.cand_number GROUP BY cand_name;
SELECT cn.cand_name, (count(vote_3) * 1) as vote_3 FROM candidate_votes cv Inner Join candidate_names …Run Code Online (Sandbox Code Playgroud) 我有一个数据表,我想导出到CSV.理想情况下,我想切换行和列,以便将数据分组得更好.
为了进一步解释,目前,数据库看起来像这样.
data_id data_timestamp data_value
--------------------------------------------
1 2011-07-07 00:01:00 0.400
1 2011-07-07 00:02:00 0.500
1 2011-07-07 00:03:00 0.600
1 2011-07-07 00:04:00 0.700
2 2011-07-07 00:01:00 0.100
2 2011-07-07 00:02:00 0.200
2 2011-07-07 00:03:00 0.250
2 2011-07-07 00:04:00 2.300
Run Code Online (Sandbox Code Playgroud)
我想要做的是将data_value按data_timestamp值分组,以便对时间戳进行分组,并且每个data_id的每个data_value都显示在一列中,而不是一行中.
data_timestamp input_1 input_2
--------------------------------------------
2011-07-07 00:01:00 0.400 0.100
2011-07-07 00:02:00 0.500 0.200
2011-07-07 00:03:00 0.600 0.250
2011-07-07 00:04:00 0.700 2.300
Run Code Online (Sandbox Code Playgroud)
以下是我正在使用的查询...
SELECT d.data_timestamp, d.input_1, d.input_2
FROM (
SELECT data_timestamp,
IF(data_id=1,data_value,NULL) AS 'input_1',
IF(data_id=2,data_value,NULL) AS 'input_2' FROM data
) AS d ORDER …Run Code Online (Sandbox Code Playgroud)