【问题标题】:How can I join this 2 queries?(A select query with join and An unpivot query)我如何加入这 2 个查询?(一个带有连接的选择查询和一个非透视查询)
【发布时间】:2012-11-27 04:59:07
【问题描述】:

这是我的两个查询

SELECT EWND.Position,
NKey = CASE WHEN ISNULL(Translation.Name, '') = '' THEN EWND.Name
ELSE  Translation.Name END, Unit = EW_N_DEF.Units                               
FROM EWND
INNER JOIN EW_N_DEF ON EW_N_DEF.Nutr_No = EWND.Nutr_No
LEFT JOIN Translation ON Translation.CodeMain = EWND.Nutr_no
WHERE Translation.CodeTrans  = 1
ORDER BY EWND.Position

这是不重要的

SELECT * 
FROM 
   (SELECT N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,N12,N13,N14,N15,N16,N17,N18,N19,N20,N21,N22,N23,N24,N25,N26,N27,N28,N29,N30,N31,N32,N33,N34
   FROM EWNVal WHERE Code=6035) Test
UNPIVOT
   (Value FOR NUTCODE IN 
      (N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,N12,N13,N14,N15,N16,N17,N18,N19,N20,N21,N22,N23,N24,N25,N26,N27,N28,N29,N30,N31,N32,N33,N34)
)AS test

查询的输出如下:

  Position Name         Unit
    1   Calories    
    2   Protein g
    3   Total Fat           g
    4   Total Carbs         g
    5   Calories from Fat   
    6   Saturated Fat       g
    7   Trans Fat           g
    8   Monounsaturated Fat g
    9   Polyunsaturated Fat g   

还有

Value Code
    0   N1
    0   N2
    0   N3
    0   N4
    0   N5
    0   N6
    0   N7
    0   N8
    0   N9

输出一定是这样的

1   Calories                0   N1
2   Protein             g   0   N2
3   Total Fat           g   0   N3
4   Total Carbs         g   0   N4
5   Calories from Fat       0   N5
6   Saturated Fat       g   0   N6
7   Trans Fat           g   0   N7
8   Monounsaturated Fat g   0   N8
9   Polyunsaturated Fat g   0   N9

两个查询都输出相同数量的行而不是列,是否可以加入这两个?我尝试了 union 但它有我无法解决的问题

提前致谢!

【问题讨论】:

  • 能否提供符合预期结果的样本数据?
  • @MANGKANOR 这两个记录集是否以任何方式相互关联?
  • 我猜是这样,它是根据它的 CODE 加入的,N1 表示位置 1 等等

标签: sql sql-server sql-server-2008-r2 unpivot


【解决方案1】:

如果您的两个查询中的数据可以根据CodePosition 的数字部分进行连接,那么您可能可以使用以下内容:

select q1.position,
  q1.name,
  q2.value,
  q2.code
from
(
  SELECT EWND.Position,
    NKey = CASE WHEN ISNULL(Translation.Name, '') = '' THEN EWND.Name
                ELSE  Translation.Name END, Unit = EW_N_DEF.Units                               
  FROM EWND
  INNER JOIN EW_N_DEF 
    ON EW_N_DEF.Nutr_No = EWND.Nutr_No
  LEFT JOIN Translation 
    ON Translation.CodeMain = EWND.Nutr_no
  WHERE Translation.CodeTrans  = 1
) q1
full outer join
(
  SELECT value, code
  FROM 
  (
     SELECT N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,N12,N13,N14,N15,N16,N17,N18,N19,N20,N21,N22,N23,N24,N25,N26,N27,N28,N29,N30,N31,N32,N33,N34
     FROM EWNVal 
     WHERE Code=6035
  ) Test
  UNPIVOT
  (
    Value FOR NUTCODE IN 
        (N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,N12,N13,N14,N15,N16,N17,N18,N19,N20,N21,N22,N23,N24,N25,N26,N27,N28,N29,N30,N31,N32,N33,N34)
  )AS test
) q2
  on q1.Position = right(q1.code, len(q1.code)-1)

【讨论】:

  • 非常感谢蓝脚!这行得通,我只是将 q1.name 更改为 q1.Nkey 和其他列名。但这是我一直在寻找的东西!非常感谢^_ __^
【解决方案2】:

在 Union 和 Union all 中,您必须使结果都具有相同的列名。对于列,您可以使用任何别名,但列名必须相同。

你可以参考这个答案

combining results of two select statements

【讨论】:

    猜你喜欢
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2021-10-01
    • 2012-10-15
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多