簡體   English   中英

SQL服務器中如何將主表選定列值作為子查詢列名傳遞

[英]How pass main table selected column value as sub query column name in SQL Server

有沒有辦法將選定的表列值傳遞給子查詢?

例如,我有一個Stock表,它有一些簡單的 A_Stock、B_Stock、C_Stock 等部分股票......

| Item Code    | A_Stock  | B_Stock  | C_Stock 
+--------------+----------+----------+---------
| Item1        | 10       |  13      |   35    
| Item2        | 15       |  20      |   45    
| Item3        |  8       |   6      |   33    

我從該表中獲得 select ItemCode 和 Section (A, B...) Like

SELECT ItemCode, Section  
FROM tableName

| Item Code    | Section  
+--------------+---------
| Item1        | A       
| Item3        | C       
| Item2        | B       

然后我想 select 項目明智的部分股票

預期結果

SELECT
    ItemCode, 
    (SELECT CONCAT(ST.SectionFrom, '_Stock') firstTable 
     WHERE ItemCode = ST.ItemCode) AS Stock
FROM 
    secondTable ST

| Item Code     | Stock 
+---------------+-------
| Item1         |  10   
| Item3         |  33   
| Item2         |  20  

但實際結果是:

| Item Code     | Stock    
+---------------+----------
| Item1         | A_Stock  
| Item3         | C_Stock  
| Item3         | B_Stock  

如果有人有解決方案,請幫助我。

您可以加入這些表並使用case..when表達式:

SELECT ItemCode, 
       (case 
        when section = 'A' then A_Stock 
        when section = 'B' then B_Stock 
        when section = 'C' then C_Stock      
        end ) AS Stock
  FROM secondTable ST
  JOIN stock S
    ON S.ItemCode = ST.ItemCode

一種方法是取消透視數據並加入:

select st.*, v.stock
from stocktable st cross apply
     (values ('A', a_stock), ('B', b_stock), ('C', c_stock)
     ) v(section, stock) join
     tablename t
     on t.item_code = st.item_code and t.section = v.section;

我喜歡這個解決方案,因為它暗示了您應該如何將數據實際存儲在stock表中。 通常,您不希望僅通過數字區分多個列。 您需要一個包含itemcodesectionstock作為三列的表。

-- Here is a solution that is not preferred as it hard codes the column names.  
--DROP TABLE firsttable
CREATE TABLE firsttable
(
    [Item_Code] nvarchar(8)
    ,[A_Stock] int
    ,[B_Stock] int
    ,[C_Stock] int
)

--DROP TABLE secondtable
CREATE TABLE secondtable
(
    [Item_Code] nvarchar(8)
    ,[Section] nvarchar(1)
)

INSERT INTO firsttable ([Item_Code],[A_Stock],[B_Stock],[C_Stock])
    VALUES  ('Item1', 10, 13, 35)
    ,('Item2', 15, 20, 45)
    ,('Item3', 8, 6, 33)

SELECT * FROM firsttable

INSERT INTO secondtable ([Item_Code],[Section])
    VALUES  ('Item1', 'A')
    ,('Item2', 'B')
    ,('Item3', 'C')

SELECT  * FROM secondtable

SELECT f.Item_Code
,(  CASE 
    WHEN CONCAT(s.Section,'_Stock') = 'A_Stock'THEN A_Stock
    WHEN CONCAT(s.Section,'_Stock') = 'B_Stock' THEN B_Stock
    ELSE C_Stock
    END
)
AS Stock

FROM firsttable f, secondtable s
WHERE f.Item_Code = s.Item_Code

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM