2013-02-16 68 views
1

我有一张表格,每列都有一些图像。在sql server中将多行中的值提取到单行中

Acd_unq_id Emp_unq_id Acd_BImg1 Acd_BImg2 Acd_RImg1 Acd_RImp2 Acd_RImg3 Acd_Active 

1   1745  BinaryImg BinaryImg  NULL  NULL  NULL   1 
2   1745  NULL  NULL BinaryImg NULL  NULL   1 
3   1745  NULL  NULL  NULL  BinaryImg BinaryImg 1 
4   1769  BinaryImg BinaryImg  NULL  NULL  BinaryImg 1 

在上面的例子中,我想为每个唯一的Emp ID在单个列中获取数据。因此,根据上面给出的例子,我希望得到的结果是如下 -

Acd_unq_id Emp_unq_id Acd_BImg1 Acd_BImg2 Acd_RImg1 Acd_RImp2 Acd_RImg3 Acd_Active 

1   1745  BinaryImg BinaryImg BinaryImg BinaryImg BinaryImg  1 
4   1769  BinaryImg BinaryImg  NULL  NULL  BinaryImg  1 

我写了一个查询这一点 -

SELECT 
(
SELECT TOP 1 ACH_BILL_IMG1 FROM ADVERT_CAMPAIGN_HEADERS INNER JOIN ADVERT_CAMPAIGN_HEADERS 
ON ACH_UNQ_ID = ACD_ACH_UNQ_ID WHERE ACD_SOC_UNQ_ID = 1745 AND ACD_IMAGETYPE IN ('H, Q')) as bill_img1 

(SELECT TOP 1 ACH_BILL_IMG2 FROM ADVERT_CAMPAIGN_HEADERS INNER JOIN ADVERT_CAMPAIGN_HEADERS 
ON ACH_UNQ_ID = ACD_ACH_UNQ_ID WHERE ACD_SOC_UNQ_ID = 1745 AND ACD_IMAGETYPE IN ('H, Q')) 

我想要得到的结果,使用子查询和顶部1但在上面的示例查询我写我得到语法错误....

* FROM子句中具有相同的暴露名的对象“ADVERT_CAMPAIGN_HEADERS”和“ADVERT_CAMPAIGN_HEADERS”。使用相关名称来区分它们。*

请帮忙。等待你的答复,专家:)

+0

如果你正在尝试做自连接,你需要的别名参加它的表引用的至少一个。 – 2013-02-16 13:00:17

+0

你好马丁,u能帮助我这个 '选择' 查询.. 选择 (选择顶部1 ach_bill_img1)作为bill_img1, (选择顶部1 ach_bill_img2)作为bill_img2, (选择顶部1 ach_rcpt_img1)作为rcpt_img1 , (选择顶部1 ach_rcpt_img2)作为rcpt_img2, (选择顶部1 ach_rcpt_img3)作为rcpt_img3, 从ADVERT_CAMPAIGN_HEADERS内(选择顶部1 ach_rcpt_img4)作为rcpt_img4 加入ADVERT_CAMPAIGN_DETAILS上ach_unq_id = acd_ach_unq_id 其中acd_soc_unq_id = 1745 这仍然给我多行结果....我想把它做成1单行... – 2013-02-16 13:30:57

回答

0

试试这个

`Select xx.Emp_unq_id,Acd_BImg1,Acd_BImg2,Acd_RImg1,Acd_RImg2,Acd_RImg3 from 
((select Emp_unq_id,Acd_BImg1 from yourtab where Emp_unq_id =1745 
and Acd_BImg1 is not null)A 
inner join 
select Emp_unq_id,Acd_BImg2 from yourtab where Emp_unq_id =1745 
and Acd_BImg2 is not null) B 
on A.Emp_unq_id=B.Emp_unq_id 
inner join 
(select Emp_unq_id,Acd_RImg1 from yourtab where Emp_unq_id =1745 
and Acd_RImg1 is not null) C 
on B.Emp_unq_id=C.Emp_unq_id 
inner join 
(select Emp_unq_id,Acd_RImg2 from yourtab where Emp_unq_id =1745 
and Acd_RImg2 is not null) D 
on C.Emp_unq_id=D.Emp_unq_id 
inner join (select Emp_unq_id,Acd_RImg3 from yourtab where Emp_unq_id =1745 
and Acd_RImg3 is not null) E 
on D.Emp_unq_id=E.Emp_unq_id)XX` 

Repet这个查询其他员工ID也...

+0

你能帮我这个查询...这个查询是不给我我需要的O/P,但我想只使用选择顶部1 ... 选择 (选择顶部1 ach_bill_img1)作为bill_img1, (选择顶部1 ach_bill_img2)作为bill_img2, (选择顶部1 ach_rcpt_img1)作为rcpt_img1, (选择顶部1 ach_rcpt_img2)作为rcpt_img2, (选择顶部1 ach_rcpt_img3)如rcpt_img3, (选择顶部1 ach_rcpt_img4)从ADVERT_CAMPAIGN_HEADERS内rcpt_img4 加入关于ach_unq_id = acd_ach_unq_id 其中acd_soc_unq_id = 1745 – 2013-02-16 13:54:08

0

从您的查询,我认为只有一个在没有空值图像列。请注意,它可能会给出理想的结果,但从性能角度来看我不知道。我也期待着对此的其他备选查询。

;WITH tempCompaignHeaders(ACD_UNQ_ID,Acd_Active) AS 
(
    SELECT DISTINCT Emp_unq_id, Acd_Active FROM ADVERT_CAMPAIGN_HEADERS 
) 
SELECT 
     (SELECT TOP 1 ACD_UNQ_ID FROM ADVERT_CAMPAIGN_HEADERS WHERE Emp_unq_id = t.Emp_unq_id ORDER BY ACD_UNQ_ID) Acd_BImg1, 
     Emp_unq_id 
     (SELECT TOP 1 Acd_BImg1 FROM ADVERT_CAMPAIGN_HEADERS WHERE Emp_unq_id = t.Emp_unq_id AND Acd_BImg1 IS NOT NULL) Acd_BImg1, 
     (SELECT TOP 1 Acd_BImg2 FROM ADVERT_CAMPAIGN_HEADERS WHERE Emp_unq_id = t.Emp_unq_id AND Acd_BImg2 IS NOT NULL) Acd_BImg2, 
     (SELECT TOP 1 Acd_RImg1 FROM ADVERT_CAMPAIGN_HEADERS WHERE Emp_unq_id = t.Emp_unq_id AND Acd_RImg1 IS NOT NULL) Acd_RImg1, 
     (SELECT TOP 1 Acd_RImg2 FROM ADVERT_CAMPAIGN_HEADERS WHERE Emp_unq_id = t.Emp_unq_id AND Acd_RImg2 IS NOT NULL) Acd_RImg2, 
     (SELECT TOP 1 Acd_RImg3 FROM ADVERT_CAMPAIGN_HEADERS WHERE Emp_unq_id = t.Emp_unq_id AND Acd_RImg3 IS NOT NULL) Acd_RImg3, 
     Acd_Active 
FROM 
     tempCompaignHeaders t 
+0

您好森迪普•,这个查询是给我相同的结果的多个时间ADVERT_CAMPAIGN_DETAILS。 – 2013-02-16 14:37:39

+0

编辑我的答案,但不知道有关ACD_UNQ_ID。我挑出了问题中显示的最高的一个。 – Sunny 2013-02-16 15:19:39

1

如何:

SELECT [Acd_unq_id] = MIN([Acd_unq_id]) 
, [Emp_unq_id] 
, [Acd_BImg1] = MAX([Acd_BImg1]) 
, [Acd_BImg2] = MAX([Acd_BImg2]) 
, [Acd_RImg1] = MAX([Acd_RImg1]) 
, [Acd_RImp2] = MAX([Acd_RImp2]) 
, [Acd_RImg3] = MAX([Acd_RImg3]) 
, [Acd_Active] = MAX([Acd_Active]) 
FROM ADVERT_CAMPAIGN_HEADERS 
GROUP BY [Emp_unq_id] 
+0

我认为同一线条,但我认为最大值函数不适用于图像数据类型.. – Sunny 2013-02-16 17:46:54

+0

它测试二进制和varbinary类型时,例如, DECLARE @t TABLE(id INT,img BINARY(4000)); (1,CAST(123456 AS BINARY(4000))) ,(1,CAST(5551212 AS BINARY(4000))); SELECT id,img = max(img) FROM @t GROUP BY id – 2013-02-16 18:16:21