2014-11-23 51 views
0

我有以下这些查询需要使用的表:一个报表:复杂的SQL查询从多个表

我只提及下表的相关列,以便它是排序和可以理解的。

- >项目[与列:的Item_ID,ItemCode,ITEMNAME等..]

Item_ID ItemCode  ItemName 
--------------------------------------------- 
1   P_1   Flower Pots 
2   P_2   Parkar Pen 
3   P_3   xyz 
4   P_4   Aero Pace 

- > channelstores【同列:商店编号,STORENAME等..]

Store_ID StoreName 
--------------------------------- 
1   Amazon UK 
2   Amazon US 
3   eBay UK 
4   eBay US 

- > channel_A [与列:ITEM_ID,商店编号等...]

Item_ID Store_ID 
--------------------- 
1   1 
1   2 
2   2 
3   1 

- > channel_B [与列:的Item_ID,商店编号等c ...]

Item_ID Store_ID 
------------------- 
1   3 
1   4 
2   3 
3   3 

表channel_A和channel_B分别具有Item_ID和Store_ID作为来自item和channelstores表的外键。现在

,问题是:我需要一个查询,可以给我结果为:

Item_ID ItemCode Amazon UK Amazon US eBay UK eBay US 
--------------------------------------------------------------------- 
1   P_1    True   True  True  True 
2   P_2    False  True  True  False 
3   P_3    True   False  True  False 
4   P_4    False  False  False  False 

我:从项目表中的所有项目,其channelstores,channel_A和channel_B关系如下结果的列表使用下面的查询,但有问题得到真/假值:

Declare @StoreName as nvarchar(Max) 
Declare @StrQuery nvarchar(Max) 
set @StoreName=(SELECT STUFF((SELECT distinct ',' + '['+p1.[storename]+']' 
FROM channelstores p1 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')) 

set @StrQuery= 
'select Item_ID,ProductCode, '[email protected]+' from 
(select i.Item_ID,i.itemcode as ProductCode,1 as Value,'''' as ChannelStore from item as i 
) as x 
pivot 
(max(Value) 
for ChannelStore in ('[email protected]+'))p order by ProductCode' 
EXEC(@StrQuery) 

谢谢。

+0

你有多少个storeNames? – 2014-11-23 18:34:28

+0

@M。页面,它是动态的,并在频道存储表中。目前有4个,但可能会增加。 – vicky 2014-11-23 18:38:39

+0

所以你可能需要一个数据透视表。您可能会看看http://msdn.microsoft.com/en-us/library/ms177410(SQL.105).aspx – 2014-11-23 19:07:08

回答

0

我只提及下表中的相关列,以便它可以排序和理解。 < <

然后,我们需要的键和约束;这意味着某种DDL。 “item_code”是否像UPC,EAN或其他行业标准代码?我们不知道。但是那个顺序的“item_id”看起来毫无用处;有人偶然在桌子上放了一个IDENTITY列吗?我们需要那个骨架!

CREATE TABLE Items 
(upc CHAR(10) NOT NULL PRIMARY KEY, 
item_name VARCHAR(25) NOT NULL); 

CREATE TABLE Channel_Stores 
(store_id CHAR(10) NOT NULL PRIMARY KEY, 
store_name VARCHAR(25) NOT NULL); 

因为你很无礼,我们也有猜测在冗余表。

- 错!

CREATE TABLE Channel_A 
(upc CHAR(10) NOT NULL PRIMARY KEY 
    REFERENCES Items(upc), 
store_id VARCHAR(25) NOT NULL 
    REFERENCES Channel_Stores(store_id), 
PRIMARY KEY (upc, store_id)); 

- 错!

CREATE TABLE Channel_B 
(upc CHAR(10) NOT NULL PRIMARY KEY 
    REFERENCES Items(upc), 
store_id VARCHAR(25) NOT NULL 
    REFERENCES Channel_Stores(store_id), 
PRIMARY KEY (upc, store_id)); 

表Channel_A和Channel_B有UPC和商店编号为分别从项目和Channel_Stores表的外键。< <

这种设计错误被称为“属性分裂”,我们不这样做。你会在模式中使用“male_Personnel”和“Female_Personnel”表吗?没有!这将是有效的ISO-11179模式中的“人员”。

你不知道什么规范化的表!这就是为什么你要修复动态SQL中的错误。此表格包含您需要传递到表示层的所有信息。

CREATE TABLE Channels 
(upc CHAR(10) NOT NULL PRIMARY KEY 
    REFERENCES Items(upc), 
store_id VARCHAR(25) NOT NULL 
    REFERENCES Channel_Stores(store_id), 
channel_name CHAR(1) NOT NULL 
    CHECK (Channel_name IN ('A', 'B')), 
PRIMARY KEY (upc, store_id, Channel_name)); 

所以简单!如此便携!现在

,问题是:我需要一个查询,可以给我结果为:< <

:所有的项目从它的Channel_Stores,Channel_A和Channel_B关系如下结果项的列表

你可能会,但一个SQL程序员会用报告工具做到这一点。没有什么是SQL。

我们不使用RDBMS中的汇编语言位标志。

我们避免专有代码,以便我们可以将程序移植到下一个版本或另一个SQL。

我们不会在查询或模式中混用XML或其他编程语言。它破坏了性能并使代码维持在拙劣的状态。

SELECT DISTINCT显示架构和查询中的设计缺陷已导致结果冗余。

我们不使用SQL中的局部变量;这是一种声明性语言。

唯一让事情变得更糟的是动态SQL违反第一范式然后你做到了!