2014-11-23 50 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違反第一範式然後你做到了!